동시성을 고려한 설계 [실용주의 프로그래머]

LEE KYU WON·2021년 1월 25일
0
post-thumbnail

우리는 프로그램을 설계할 때 시간적 결합(temporal coupling). 을 만들게 된다. 예를 들어 메서드 A는 메서드 B보다 먼저 호출 되어야 한다 등의 제약이다. 만약 독립되어 실행 할 수 있는 작업은 동시성을 허용 할 필요가 있고 앞의 경우와 같은 시간적 결합이 있는 겨경우 시간이나 순서에 따른 의존성의 결합을 줄일 수 있는 생각 할 필요가 있다.

작업흐름

실용주의 프로그래머 39
작업흐름 분석을 통해 동시성을 개선하라

우리가 동시성이 있는 프로그램을 설계하기 위해서는 동시에 일어나도 되는것은 어떤것이고, 엄격한 순서에 따라 일어나야 하는 것은 어떤것인지 찾아야 한다. 이런 작업을 위해 URL 활동 다이어그램 (activity diagram) 을 사용해서 동시에 수행 될 수 있는 작업을 찾아 병렬성을 극대화 할 수 있다.

아키텍처 설계

실용주의 프로그래머 40
서비스를 사용해서 설계하라.

n-tier 또는 다중처리 분상 애플리케이션 제작을 통해 시간적 결합을 끊을 수 있다. 왠지 할 일이 더 많게 들리지만 오히려 작성이 더 쉬워질 수 있다.

그림과 같이 비동기적으로 진행되어야 하는 프로시저들이 들어왔을 때 프로시저 작업을 할당받는 부분과 해당 작업을 처리하는 worker 부분을 큐를 통해 통신시켜 시간적 의존성을 분리 할 수 있다.

큐에 작업이 들어왔을 때 작업은 worker 들에게 자동으로 할당되는데 이것은 배고픈 소비자 (hungry consumer) 모델을 사용 할 수 있다. worker 는 각자 작업을 마치면 큐에서 작업을 deque 해서 알아서 가져가는 것이다. 만약 어떤 작업 하나가 버벅거리더라도 다른 worker 들이 큐에 들어오는 일을 가져 갈 수 있어서 컴포넌트들은 자기 속도에 맞추어 일을 진행 할 수 있다.

이런 독립적이고 동시적인 컴포넌트를 서비스라고 한다.

동시성을 고려한 설계

운영체제 이론을 배우면 동시성이 있는 컴포넌트간에 공유하는 자원은 어떤 문제를 이르킬 수 있으며 이런 문제들이 시스템을 완전히 정지시킬 수 있다는 것을 배웠다. 이러한 오류르를 방지하기 위해 근본적인 대책을 마련 할 필요가 잇다.

  1. 모든 전역 변수나 정적 변수들을 동시 접근으로부터 보호해야 한다.
  2. 호출 순서와 관계없이 일관성 있는 상태 정보를 보일 수 있는지 확인 해 보아야 한다.

배치

이러한 동시성 요소가 포함된 아키텍처를 설계한 다음에는 수많은 동시적 서비스들을 다루는것이 쉬워진다. 동시성이 고려된 애플리케이션을 비동시적 프로그램으로 설계하는것은 어렵지 않지만 비동시적인 아키텍처를 그렇지 않은것으로 바꾸는 것은 아주 어려운 일이고 따라서 동시적인 설계는 아키텍처적인 유연성도 누릴 수 있다.

profile
벼랑끝에서 성장하는 개발자 이규원입니다.

0개의 댓글