마이크로 서비스 환경에서 서비스 간의 통합은 REST API, RPC, 그리고 메시징 시스템을 활용하여 처리할 수 있는데, 이번에는 메시징 시스템을 활용하는 방법에 대해 한번 얘기 해보려고 한다.

REST API나, RPC의 경우 서비스 간의 통신을 위해서는 해당 서비스의 정보를 가지고 있어야 한다. 그렇기 때문에 서비스 간의 의존성이 생길 수 밖에 없는 반면에 메시징 시스템의 경우 서비스를 몰라도 되기 때문에 의존성이 제거 된다. 보통 메시징 시스템을 활용하게 되면 다음과 같은 아키텍처가 구성된다.

예를 들어 주문이 완료 되고 배송을 해야 한다면, 주문 서비스에서 주문 완료 라는 통합 이벤트를 메시징 시스템으로 전달하고 배송 서비스에서는 해다 이벤트를 받아 배송 로직을 수행 하면 된다. 이 경우 배송 서비스 입장에서는 주문 서비스의 존재를 알 수가 없고, 그럴 필요도 없다.

통합 이벤트를 사용하는 경우 다음과 같은 이슈들을 생각 해볼 수 있다.

통합 이벤트 발행이 실패하게 되면 트랜잭션은 롤백 되므로 문제가 없다. 하지만 통합 이벤트 발행은 성공 했지만 트랜잭션이 실패 하는 경우를 생각 해보면 이미 서비스 외부로 통합 이벤트가 발행 되었기 때문에 문제가 발생한다.

트랜잭션이 성공 했지만 이벤트 발행에 실패하는 경우가 생길 수 가 있다. 트랜잭션은 이미 커밋을 한 상태라 롤백이 힘들어 진다.

그럼 어떻게 해결할 수 있을까? 통합 이벤트를 사용할 때 아웃박스 패턴을 사용할 수 있다. 아웃박스 패턴이란 실제 발행 해야할 통합 이벤트를 트랜잭션에 묶어 데이터베이스에 저장하고 이를 별도로 발행하는 것이다.

이렇게 되면 통합 이벤트 발행과 트랜잭션을 안전하게 처리할 수 있게 된다. 메시지 릴레이를 구현하는 방식은 2가지가 있다. 하나는 주기적으로 폴링을 하는 방식이고 또 다른 방식은 로그 파일을 읽는 방식이다.