시스템 간 비동기 연동 방식에는 무엇이 있나요?

백엔드와 관련된 질문이에요.

분리된 시스템 간의 비동기 연동은 시스템 간의 결합도를 낮출 수 있으며, 호출된 시스템의 응답을 기다리지 않으므로 더욱 빨리 사용자의 요청에 응답할 수 있다는 장점이 있습니다. 비동기 연동 방식으로 메시징 시스템 활용, 데이터베이스 활용, CDC 활용 방식을 알고 있습니다.

각 방식에 대한 설명과 고려 사항을 설명해 주세요. 😀

메시징 시스템 활용 방식은 두 시스템 사이에 메시징 시스템을 두어 비동기로 연동하는 방식입니다. 해당 방식은 한 시스템에서 메시지를 생성해서 메시징 시스템에 송신한 이후, 다른 시스템에서 메시징 시스템으로부터 메시지를 읽어와 메시지를 처리합니다. KafKa, RabbitMQ가 주로 메시징 시스템으로 활용됩니다. 해당 방식은 처리량이 높은 것이 장점입니다. 하지만, 메시지 유실, 메시지 소비 순서, 트랜잭션에 대한 고민이 추가적으로 필요합니다. 트랜잭션에 대한 고민을 더욱 말씀 드리자면, 1개의 트랜잭션 내에 메시지 전송과 데이터베이스 삽입이 존재한다고 했을 때, 데이터베이스 삽입이 실패했는 데 메시지는 전송되거나, 데이터베이스 삽입은 성공했는데, 메시지 전송이 실패한 경우를 떠올려 볼 수 있습니다. 만약 이러한 상황이 존재한다면, 2개의 작업을 어떻게 원자적으로 수행할 수 있을 지 추가적인 고민이 필요합니다.

데이터베이스 활용 방식은 데이터베이스를 메시징 시스템처럼 사용하는 방법입니다. 한 시스템에서 데이터베이스 테이블에 필요한 메시지 레코드를 추가하고 연동 시스템이 테이블을 주기적으로 읽습니다. 만약 새로운 메시지가 추가되면 연동 시스템은 다른 시스템으로 메시지를 전송합니다. 해당 방식은 트랜잭션과 메시지 순서가 보장되며, 메시지 유실에 대한 걱정이 없다는 것이 장점입니다. 하지만, 해당 방식은 범용성이 떨어질 수 있습니다. 메시지에 대한 형식이 빈번히 변경될때마다 메시지 레코드에 대한 스키마도 변경해주어야하기 때문입니다. 추가적으로 해당 방식은 삭제 정책과 읽기 빈도 등 추가적으로 고민해야할 부분들이 존재합니다.

CDC(Change Data Capture) 활용 방식은 데이터베이스의 변경 사항을 조회하여, 이를 다른 시스템에 전파하는 방식입니다. 가령 별도의 시스템이 변경 감지 대상 데이터베이스의 바이너리 로그를 조회하여 변경을 전파하도록 구현할 수 있습니다. 해당 방식은 트랜잭션이 보장되며, 메시지를 생성하거나 별도로 저장할 필요가 없으니 상대적으로 애플리케이션 로직이 단순하다는 장점이 있습니다. 하지만, 변경 로그만 존재할뿐 왜 바뀌었는지에 대한 추가적인 정보가 없기 때문에 사용하는데 제약이 존재할 수 있습니다.

추가 학습 자료를 공유합니다.