Write-Behind + Cache-Aside 전략

WAS·2026년 6월 9일

사이드프로젝트

목록 보기
5/6

💡 기존 문제점

 메시지 전송 ->  ChatMessageController.sendMessage()  
 							↓
                     [Kafka Producer]  
                     		↓
                     [Kafka Topic]
                            ↓
                     [Kafka Consumer]
                            ↓
                      ① DB INSERT (메시지 저장)       ← Oracle 동기 대기
                            ↓
                      ② DB SELECT (발신자 이름 조회)   ← Oracle 동기 대기
                      ③ DB SELECT (전송 시각 조회)     ← Oracle 동기 대기
                            ↓
                     [Redis Publish]
                            ↓
                     [RedisSubscriber]                         
                            ↓
                     [WebSocket 전송] → [상대방 화면]

위와 같은 구조로 메시지를 여러번 계속 전송하면 DB 응답을 기다리는 동안
WebSocket 전송이 블로킹이 되어, 사용자 입장에서는 메시지 딜레이가 생겼다.

이를 해결하기 위해서
Kafka 토픽에서 두 그룹으로 나눴다.

 chat-messages 토픽
          ↓
    ┌─────┴──────────────┐
    ↓                  ↓
  chat-group        chat-db-writer
  (화면 전송 담당)    (DB 저장 담당)

다음 사진처럼 각 그룹 조회해보면, LAG 이 0으로 나오는데, 이 숫자가 있으면 처리하지 못한 메시지 의 수를 의미한것으로 현재는 메시지 지연없이 잘 처리된 모습이다.

chat-group 부분에서는 기존에 DB 조회 및 업데이트를 처리했지만
Cache-Aside 방식으로 저장해놓은 Redis 캐시에서 데이터를 조회하고, 없으면 디비에서 조회한 후 캐시에 넣는 방식으로 구현

chat-db-writer 부분에서는 기존에 로직안에서 DB INSERT 작업을 진행했지만
Kafka 토픽 그룹 아이디를 하나 더 만들어서, 독립적으로 별도 스레드에서 DB INSERT를 진행
즉 쉽게말해서 chat-group 부분에서 로직이 실행되는동안 DB 대기를 할 필요가 없다.

채팅방에 입장했을 때 (메시지 읽음 처리) 는 기존에는 DB UPDATE 로 읽음처리 = 'Y' 로 변경했지만
1분마다 스케줄러를 통해서 자동으로 DB UPDATE 처리되도록 변경하였다.

Write-Behind : 데이터 저장 요청 시 캐시에만 기록하고, 일정한 시간 간격으로 배치 작업(batch)을 통해 데이터베이스에 기록하는 방식

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글