더북(TheBook)

3.3.5 수신자 경합과 메시지 순서 유지

메시지 순서를 유지한 채 메시지 수신자를 수평 확장(scale-out, 스케일 아웃)할 수 있을까요? 일반적으로 메시지를 동시 처리하려면 서비스 인스턴스를 여럿 두어야 합니다. 물론 단일 서비스 인스턴스라도 스레드를 이용하면 여러 메시지를 동시 처리할 수 있지만, 다수의 스레드와 서비스 인스턴스를 동원하면 애플리케이션 처리율이 증가합니다. 그런데 이렇게 메시지를 동시 처리하면 각 메시지를 정확히 한 번만 순서대로 처리해야 합니다.

예를 들어 동일한 점대점 채널을 읽는 서비스 인스턴스가 3개 있고, 송신자는 주문 생성됨, 주문 변경됨, 주문 취소됨 이벤트 메시지를 차례로 전송한다고 합시다. 단순하게 보면 메시지를 종류별로 정해진 수신자에 동시 전달하면 될 것 같지만, 갖가지 네트워크 이슈나 가비지 컬렉션 문제로 지연이 발생하고 메시지 처리 순서가 어긋나면 시스템이 오동작할 수 있습니다. 다른 서비스가 주문 생성됨 메시지를 처리하기도 전에 주문 취소됨 메시지를 처리하는 진풍경이 벌어지겠죠!

그래서 아파치 카프카, AWS 키네시스 등 요즘 메시지 브로커는 샤딩된(sharded, 파티셔닝된(partitioned)) 채널을 이용합니다(그림 3-11).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.