Posts 실용주의프로그래머 6장 동시성
Post
Cancel

실용주의프로그래머 6장 동시성

  • 동시성 : 둘 이상의 코드 조작이 실행될 때 동시에 실행 중인 것처럼 행동하는 것. 소프트웨어 동작
    • 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야함. ex) 스레드, 프로세스
  • 병렬성 : 실제로 동시에 실행되는 것. 하드웨어 동작
    • 두가지 일을 동시에 할 수 있는 하드웨어가 필요함. ex) CPU내 코어, 네트워크로 연결된 컴퓨터 등

모든 일에 동시성이 있다.

시스템이 커지면 동시성은 필수다. 어떤 일을 할 때, 한번에 하나씩 순차적으로 수행 하면 시스템이 매우 느려질 것이기 때문이다.

따라서 코드 간의 결합 이외에도, 시간적 결합을 깨는 것도 중요하다.

Topic 33 : 시간적 결합 깨트리기

코드를 짜다보면 순차적 사고를 하기 마련이다. 하지만 유연성과 동시성을 확보하기 위해 시간이나 순서에 의존하는 시간적 결합을 끊어야한다. 그럼 시간 관련 의존성을 줄일 수 있고, 더 빠르고 안정적인 시스템을 만들 수 있다.

동시성 찾기

동시에 일어나도 되는 일과 반드시 순서대로 일어나야하는 일을 구분하기 위해, 활동 다이어그램 등을 사용하여 작업 흐름을 모델화 할 수 있다.

동시 작업의 기회

활동 다이어그램을 통해 동시에 작업할 수 있는 부분들이 있다. 이 중에서 데이터베이스 접근, 외부 서비스 요청 등 우리 코드가 아닌 곳에서 시간이 걸리는 일을 할 때, 우리 코드는 다른 작업을 할 수 있을 것이다.

병렬 작업의 기회

큰 작업을 독립적인 부분 작업으로 나누어 여러 프로세서에서 동시에 일을 처리할 수 있다.


Topic 34 : 공유 상태는 틀린 상태

공유 상태는 틀린 상태다

상태가 공유되면 동시성을 구현할 때 프로그램 오류가 발생할 수 있다. 따라서 어떤 상태가 있다면 이를 원자적으로 갱신하여야한다. 여기에는 다음 방법들이 있다.

  • 세마포어
    • 세마포어를 소유하고 있을 때만 조회/갱신을 할 수 있도록 함.
    • 단점 : 누군가가 세마포어를 얻는걸 잊어버릴 수 있음.
  • 리소스를 트랜잭션으로 관리하라
    • 리소스 제어를 중앙으로 집중하여, 조회와 동시에 업데이트를 할 수 있도록 한다.

여러 리소스와 트랜잭션

어떤 작업을 수행할 때, 여러 리소스가 동시에 필요하면 공유 상태 관리는 더 복잡해진다. 하지만 이때도 여러 리소스를 하나의 리소스로 보고, 이 리소스에 접근하는 코드를 모듈로 옮긴 후, 클라이언트는 그 리소스를 달라고 요청하면 그림이 간단해진다. 클라이언트가 여러 리소스를 직접 호출하는 것보다 훨씬 간단하다.

트랜잭션이 없는 갱신

수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다. 여기에는 한가지 팁이 있다.

불규칙한 실패는 동시성 문제인 경우가 많다.


Topic 35 : 액터와 프로세스

액터

자신만의 비공개 지역상태를 가진 독립적인 가상 처리 장치. 우편함을 하나씩 보유하고 있고, 메세지를 받으면 차례대로 처리한다. 메세지를 처리할 때 액터는 다른 액터를 생성하거나, 메세지를 보낼 수 있고, 새로운 상태를 생성할 수 있다.

액터는 언제나 동시성을 띤다

  • 액터를 관리하는 것은 없다.
  • 시스템이 저장하는 상태는 메시지와 각 액터 내의 지역 상태일 뿐이다.
  • 모든 메시지는 일방향이고, 메시지 내에서 다른 메시지를 보내는 것만 가능하다.
  • 한번에 하나의 메시지만 처리한다.

위 특징들로 액터들은 아무것도 공유하지 않고 비동기적으로 동시에 실행된다. 따라서 동시성을 다루는 코드도 필요없다.

공유 상태 없는 동시성을 위하여 액터를 사용하라


Topic 36 : 칠판

칠판은 일종의 자유방임주의적 동시성으로, 독립된 프로세스, 에이전트 등이 수집한 사실을 붙이고 누군가는 떼어내기도 한다. (ex : 린다, JavaSpace, T Spaces 등)

복잡한 규칙과 과정을 준수해야하는 대출 시스템에서 사용할 수도 있는데, 어떤 사실이 칠판에 올라가면 규칙 엔진이 돌아가서 적절한 규칙을 발동시키면 된다.

메시지 시스템과 칠판의 유사성

카프카와 같은 메시징 시스템은 단순히 메시지를 보내는 것 이상으로 이벤트 로그를 통한 영속성지원, 패턴 매칭으로 메시지 조회를 지원한다. 따라서 메시징 시스템을 칠판으로 사용할 수도 있다.

하지만 간단하지 않다.

아키텍처에서 액터, 칠판, 마이크로서비스를 사용하면 애플리케이션에서 생길 수 있는 동시성 문제를 예방할 수 있다. 하지만, 이런 접근 방식은 많은 동작이 간접적으로 일어나서 분석이 어렵다.

이에 대한 기법으로, 처리를 시작할 때 고유한 ‘추적 아이디 (Trace Id)’를 붙일 수 있다.

This post is licensed under CC BY 4.0 by the author.

실용주의프로그래머 5장 구부러지거나 부러지거나

실용주의프로그래머 7장 코딩하는 동안

Comments powered by Disqus.