Messaging Services에서 Message의 의미가 무엇인가요?

Message의 본질, 그리고 Command, Query, Event의 차이점

서론

흔히 Microservices, Miniservices와 같이 분산 시스템 환경에서 컴포넌트 간 데이터를 전달하기 위해 Message를 생산하고 소비한다.

이번 포스팅에선 Message가 무엇인지, 그리고 Command, Query, Event의 각 개념과 차이점은 무엇인지에 대해서 작성해보려고한다.

Message의 본질

Message는 시스템 간 통신의 기본 단위로, 정보를 주고받는 매개체 역할을 한다. 그리고 데이터를 담은 컨테이너일 뿐만 아니라, 전송 의도와 의미를 전달한다.

이 때, 의도에 따라 Message는 아래와 같이 세가지 유형으로 분류 해볼 수 있다.

Message

ㄴ Command

ㄴ Event

ㄴ Query

명령(Command)

명시적으로 특정 동작을 수행하라는 요청을 뜻한다.

시스템에선 상태의 변경을 발생시키는 요청이라고 할 수 있다. 예를들어, 결제를 요청(ProcessPaymentCommand)하거나 예약을 하는것(ReserveCommand)처럼 일반적으로 상태를 변경하기 위한 요청이라고 볼 수 있다.

주요 특징으로는 요청자가 수신자(Consumer)를 의존한다. 예약을 요청한다는것은, 요청자가 수신자를 알고 Message를 요청한다는것과 같다.

사건(Event)

이미 발생한 사실을 뜻한다.

시스템에선 과거의 상태 변경을 전달하고, 수신자가 이를 기반으로 적절히 반응(Reaction)할 수 있다. 예를 들어, 결제 완료됨(PaymentCompleted)예약됨(Reserved)처럼 과거에 발생한 사실의 정보가 담긴 값이다.

주요 특징으로는 수신자가 특정되지않고, 발행자(Producer)는 수신자(Consumer)의 존재 여부에 의존하지않는다.

조회(Query)

데이터를 요청하거나 조회하기 위한 요청을 뜻한다.

시스템에선 상태에 변경을 가하지않고, 단순히 정보를 반환하는데 초점이 맞춰져있다. 예를들어, 결제 내역 조회(PaymentsQuery)를 하거나 예약 내역 조회(ReservationsQuery)처럼 시스템 상태를 유지하면서 필요한 정보를 얻는데 사용된다.

예시로 알아보면

대게 커머스 주문 시스템에선 사용자가 상품을 주문하면, 다양한 서비스들이 협력하여 주문 생성, 결제 처리, 재고 차감 등을 수행하는 구조를 갖게된다. 이 과정에서 Message를 어떻게 구분 하는지에 대해 알아보면 다음과 같다.

(물론 시스템 설계자에 따라 의존 방향, 이벤트 설계는 다를 수 있다.)

  1. 주문 생성 명령 (Command)

클라이언트가 Order Service로 주문 생성 명령(CreateOrderCommand)을 전달한다. 이 때, 내부 논리를 통해 Order Entity가 생성될 것이다.

이 때, Order Serivce로 요청자가 수신자를 알고 요청하는(의존하는) 형태가 되는것을 알 수 있다.

  1. 주문 생성됨 사건 (Event)

주문 생성이 완료되면 Order Service에서는 주문 생성됨(OrderCreated)의 실제 발생한 사건에 대해 발행한다.

이 때, 일반적으로 해당 주문이 완료되면 결제가 진행되어야하고 상품 인벤토리의 개수가 차감되어야한다. 그리고 사용자에게 주문이 완료되었다는 알림을 보내야한다.

각 Payment Service, Inventory Service, Notification Service는 해당 이벤트를 구독하고 있는 상태라면, 사건이 발생한것을 반응하여 Payment Service에서는 결제 프로세스를 진행하고 Inventory Service에서는 해당 상품의 재고 차감을 진행할 것이다. 그리고 Notification Service는 주문 완료되었다는 고객의 번호 또는 이메일로 완료 내용을 알릴 것이다.

이 때, Order Service는 주문 생성을 완료하고 해당 사건에 대해 발행만 했을 뿐, 구독자와 이벤트를 소비한 주체가 누군지 모른다. 즉, Event의 의존방향은 Command와 달리 발행자는 수신자를 모르는 형태가 된다.

  1. 주문 조회 (Query)

주문이 완료된 내역을 조회(OrderQuery)한다.

상태의 부작용을 갖고있지않기에 특별한 복잡성 없이 주문의 식별값을 통해 구체적인 상태의 정보를 취득할 수 있다.

마치며

Messaging Services에서 Message는 Command, Query, Event를 포괄한 넓은 개념이라는것을 알아보았다. 대게 이를 명확하게 구분지어 표현할 때가 얻는 이점이 더 많을 때가 있기때문에 각 개념들을 정확히 이해하고 사용하는것이 중요하다고 생각한다.