Skip to main content

Command Palette

Search for a command to run...

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

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

Updated
2 min readView as Markdown

서론

흔히 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를 포괄한 넓은 개념이라는것을 알아보았다. 대게 이를 명확하게 구분지어 표현할 때가 얻는 이점이 더 많을 때가 있기때문에 각 개념들을 정확히 이해하고 사용하는것이 중요하다고 생각한다.

More from this blog

갑자기 모든 Gateway에서 500이 발생했던 이유

배경 오후 12:40 분 경, 운영 환경의 Gateway 세 개가 동시에 많은 에러가 발생했습니다. 인터널, 유저향, 외부 파트너(Open) 까지 세 서비스 모두 500과 502가 같이 폭증했어요. 세 서비스가 같은 시점에 같이 발생했다는 건 경험상 보통 두 가지 중 하나였어요. 첫째는 공통 의존 대상에 문제가 생겼을 때, 둘째는 트래픽 자체가 spike

May 25, 20269 min read7

데이터로 해자를 만든다는 것

배경 미용 의료 플랫폼은 크게 두 종류의 데이터를 가지고 있습니다. 하나는 예약 데이터입니다. 고객이 어떤 시술을 원하고, 얼마를 지불할 의향이 있는지. 강남언니 같은 예약 플랫폼이 이 데이터를 대량으로 보유하고 있죠. 다른 하나는 "실 결제 데이터"입니다. 고객이 병원에 와서 실제로 어떤 시술을 받고, 얼마를 결제했는지. 병원 CRM(KOS, 제품 이름

May 7, 20268 min read10

리텐션이 0에 수렴해서 데이터부터 다시 들여다봤더니

Foundry는 백엔드 엔지니어를 위한 기초 지식 학습 플랫폼입니다. 시험을 보고, 틀린 문제를 오답노트에 정리하고, 개념을 복습하는 서비스인데요. 베타 오픈 후 커뮤니티에 올려서 유저도 좀 모았고, 기능도 하나하나 잘 만들어놨다고 생각했습니다. 그런데 GA4를 열어보니 현실은 달랐거든요. 문제: 숫자가 말해주는 현실 GA4 리포트를 열어봤더니 대시보드 페

Mar 15, 20265 min read38

물음표 엔지니어

22 posts

기술적 접근에 있어 트레이드 오프에 대한 고민을 다뤄보려합니다.

(Deprecated Blog: https://jeongkyun-it.tistory.com)