
실시간 다중 채팅 서비스 프로젝트를 진행하며 겪었던 문제와 해결과정을 기록합니다.
웹 소켓 서버가 분산된 환경에서 REST API 서버가 처리한 내용을 웹 소켓 서버는 알 수 없습니다.public class ChatEventProducer {
...
@Async
@Override
public void produceEnter(이벤트_모델 model) {
... 카프카 이벤트 발행 ...
}
...
}
---
public class SimpleChatRoomService {
...
@Override
@Transactional
public Room enterRoom(식별자_자료형 roomId, 요청_모델 request) {
1. 락 획득
2. 채팅 방 입장 처리
3. if 입장 성공 then chatEventProducer.produceEnter(new 이벤트_모델());
}
...
}
@Async 어노테이션으로 이벤트 발행 과정을 비동기 처리합니다. 이벤트 발행을 정상적으로 수행했는지 확인하는 절차를 추가할 수 있습니다.비즈니스 로직에서 수행하는 책임 증가 문제
- 트랜잭션 처리와 이벤트 발행 로직이 합쳐져 복잡도가 증가합니다 이벤트 발행 실패에 따른 롤백 처리문제가 발생할 수 있고 여러 동작을 한꺼번에 처리하기 때문에 유지보수성을 저해합니다.

v0.0.1에서 CQRS패턴을 위해 적용한 Debezium을 도입할 수 있습니다.Debezium은 트랜잭션 로그를 읽고 Kafka에 이벤트를 발행하는 CDC(Change Data Capture)도구 입니다.
Kafka로 발행된 이벤트는 웹 소켓 서버에서 Consume 되며 입/퇴장 이벤트에 필요한 로직을 수행합니다.CDC도구 Debezium을 도입했습니다.