시스템 간 비동기 연동 방식?
[분리된 시스템 간의 비동기 연동]
시스템간 결합도를 낮추고, 시스템의 응답을 기다리지 않으므로 더욱 빨리 사용자의 요청에 응답할 수 있다는 장점.
비동기 연동 방식으로 메시징 시스템 활용, 데이터베이스 활용, CDC 활용
메시징 시스템 활용 방식
두 시스템 사이에 메시징 시스템을 두어 비동기로 연동하는 방식
한 시스템에서 메시지를 생성, 메시징 시스템에 송신한 이후, 다른 시스템에서 메시징 시스템으로부터 메시지를 읽어와 메시지를 처리합니다. KafKa, RabbitMQ가 주로 메시징 시스템으로 활용됩니다. 해당 방식은 처리량이 높은 것이 장점
하지만, 메시지 유실, 메시지 소비 순서, 트랜잭션에 대한 고민이 추가적으로 필요함.
1개의 트랜잭션 내에 메시지 전송과 데이터베이스 삽입이 존재한다고 했을 때 데이터베이스 삽입이 실패했는데 메시지는 ㅓㄴ송되거나, 데잍어 베이스 삽입은 성공했는데, 메시지 전송이 실패한 경우
이런 경우 2ㅐㄱ의 작업을 어떻게 원자적으로 처리할 수 있을지 추가적 고민 필요
데이터 베이스 활용 방식
데이터베이스를 메시징 시스템처럼 사용하는 방법
한 시스템에서 데이터베이스 테이블에 필요한 메시지 레코드를 추가하고 연동 시스템이 테이블을 주기적으로 읽음
만약 새로운 메시지가 추가되면 연동 시스템은 다른 시스템으로 메시지를 전송함
해당 방식은 트랜잭션과 메시지 순서가 보장되며, 메시지 유실에 대한 걱정이 없다는 것이 장점
하지만 범용성이 떨어짐. 메시지에 대한 형식이 빈번히 변경될때마다 메시지 레코드에 대한 스키마도 변경해주어야함. 추가적으로 해당 방식은 삭제 정책과 읽기 빈도 등 추가적으로 고민해야할 부분들이 존재함
CDC(Change Data Capture)
데이터베이스의 변경 사항을 조회하여, 이를 다른 시스템에 전파하는 방식
가령 별도의 시스템이 변경 감지 대상 데이터베이스의 바이너리 로그를 조회하여 변경을 전파하도록 구현할 수 있음.
트랜잭션이 보장됨, 메시지를 생성하거나 별도로 저장할 필요가 없으니 상대적으로 애플리케이션 로직이 단순하다는 장점이 있음
하지만 변경 로그만 존재할뿐 왜 바뀌었는지에 대한 추가적인 정보가 없기 때문에 사용하는데에 제약이 존재할 수 있음.
RDB를 사용하는 애플리케이션에서 전달 방법
@Transactional 사용하면 AOP를 사용
객체에 proxy객체 하나 싸고있음
@TransactionalEventListener
@Retryable
Transactional Outbox 패턴 적용
RabbitMQ
Last updated