더북(TheBook)

3.3.6 중복 메시지 처리

중복 메시지 처리 문제도 골칫거리입니다. 메시지 브로커가 각 메시지를 꼭 한 번만 전달하면 좋겠지만, 그렇게 강제하려면 그만큼 값비싼 대가를 치러야 합니다. 그래서 메시지 브로커는 보통 적어도 한 번 이상 메시지를 전달하겠노라 약속합니다.

시스템이 정상일 때 ‘적어도 한 번 전달’을 보장하는 메시지 브로커는 각 메시지를 한 번만 전달합니다. 그러나 클라이언트나 네트워크 또는 브로커 자신이 실패할 경우, 같은 메시지를 여러 번 전달할 수도 있습니다. 메시지 처리 후 DB 업데이트까지 마쳤는데, 메시지를 ACK하기 전에 클라이언트가 갑자기 멎었다고 합시다. 클라이언트가 재시동하면 메시지 브로커는 ACK 안 된 메시지를 다시 보내거나 다른 클라이언트 레플리카에 전송할 것입니다.

메시지 브로커가 메시지를 재전송할 때 원래 순서까지 유지하면 이상적입니다. 클라이언트가 주문 생성됨 이벤트 → 주문 취소됨 이벤트 순서로 처리하는데, 뭔가 문제가 발생해서 ‘주문 생성됨’ 이벤트 ACK를 못 받았다고 합시다. 나중에 메시지 브로커가 주문 생성됨 이벤트만 재전송하면 클라이언트가 주문 취소를 언두(undo, 어떤 행위를 하기 이전 상태로 되돌리는 것)할 가능성이 있기 때문에 주문 생성됨, 주문 취소됨 두 이벤트를 모두 재전송해야 합니다.

중복 메시지를 처리하는 방법은 다음 두 가지입니다.

멱등한(idempotent) 메시지 핸들러를 작성합니다.

메시지를 추적하고 중복을 솎아 냅니다.

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