모두싸인이 AWS에서 Naver Cloud로 마이그레이션하면서 SNS/SQS, Kafka, Redis, BullMQ가 혼재하던 이벤트 버스를 무중단으로 통합 개선한 과정을 다룬다. 이벤트를 통합이벤트/비동기커맨드/비동기태스크로 분류하고, headers에 context와 failure 정보를 표준화한 전략이 핵심이다.
핵심 포인트- 기존 SNS/SQS, Kafka, Redis, BullMQ 혼용 구조를 이벤트 타입별로 재분류해 통합
- 이벤트를 통합이벤트(도메인 사실), 비동기 커맨드(작업 지시), 비동기 태스크(단순 처리)로 3분류
- Kafka + BullMQ 조합으로 최종 이벤트 버스 구성, 각 타입에 적합한 브로커 배치
- headers에 traceId/spanId 등 context 정보와 failure 정책(retry/dlq)을 표준 스키마로 정의
- 무중단 배포: 레거시 consumer를 유지한 채 신규 채널만 먼저 발행해 점진적 전환
상세 정리- AWS 리전 철수로 Naver Cloud 마이그레이션 필요, 기존 SNS/SQS 의존 코드가 수백 곳 분산
- 이벤트 분류 기준: 통합이벤트는 도메인 상태 변화 사실(발행자 중심), 비동기 커맨드는 처리 책임 위임(수신자 중심), 비동기 태스크는 retry/backoff 필요한 단순 작업
- Kafka를 통합이벤트와 비동기 커맨드에, BullMQ(Redis 기반)를 비동기 태스크에 배정
- 모든 메시지 headers에 x-trace-id, x-span-id, x-failure-count, x-dlq-reason 필드를 표준화해 디버깅 일관성 확보
- 레거시 consumer를 삭제하지 않고 신규 채널로 동일 메시지를 발행하는 dual-write 전략으로 롤백 경로 보존
- 전환 완료 후 레거시 채널 발행 중단, consumer 제거 순서로 정리
- 브로커별 특성(Kafka: ordering/replay, Redis/BullMQ: backoff/concurrency) 이해가 타입 배정에 필수
- 마이그레이션 중 메시지 유실 없이 서비스 연속성 유지가 핵심 제약, dual-write가 그 해법
왜 읽나운영 중인 마이크로서비스의 이벤트 버스를 무중단으로 재설계해야 하는 팀에 분류 체계와 점진적 전환 전략을 제공한다.