본문 바로가기

패스트캠퍼스/50일의 기적 AI 환급반

패스트캠퍼스 환급챌린지 42일차 : 대규모 채팅 플랫폼으로 한 번에 끝내는 실전 대용량 트래픽 커버 완전판 강의 후기

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://fastcampus.info/4n8ztzq

 

 

안녕하세요 :)

오늘은 "50일의 기적 AI 환급반_ 대규모 채팅 플랫폼으로 한 번에 끝내는 실전 대용량 트래픽 커버 완전판" 챌린지에 도전하는 마흔 두번째 날입니다.

 

마흔 한번째 날에는 레디스 사용하여 채팅방 기준 메시지 시퀸스 넘버 생성하기에 대해 배웠었는데요. 오늘은 과연 어떤 내용들을 배울 수 있을지 공부하고 포스팅 하도록 하겠습니다.

 

 

오늘 학습할 내용의 제목은,

Part 4. 서비스 부하 분산을 위한 분리 시작 Ch 5. 메시지 순서 보장을 위한 메시지 시퀸스 넘버 생성기 추가 >

03. 채팅 프로젝트에 메시지 시퀸스 넘버 생성기 추가

입니다.

 


💬 채팅 프로젝트에 메시지 시퀀스 넘버 생성기 추가

  • 이번 글은 챕터4에서 엔진엑스까지 적용한 채팅 프로젝트에 '메시지 시퀀스 넘버 생성기'를 도입한 작업 요약입니다.
  • 목표는 채널별(채팅방 기준) 메시지 순서 보장이며, 이를 위해 Redis를 시퀀스 ID 저장소로 사용하고 메시지 쓰기 흐름에 통합했습니다.

🛠 1. POC 환경 구성

  • 기반 예제 : 파트2의 다이렉트 채팅 예제 재사용
  • Redis 의존성 & 도커 컴포즈 설정 추가
  • AOF(Append-Only File) 모드 활성화
    • appendfsync everysec 설정 → 1초 단위로 디스크 동기화
    • 장애 시 시퀀스 유실 최소화 목적
  • 한계 : 단일 노드 환경이라 완전한 내구성 불가 → 추후 Redis 클러스터로 보완 예정

 

⚙️ 2. 시퀀스 ID 생성 로직

  • MessageSeqIdGenerator 구현 (기반: RedisTemplate)
  • 채널별 키 패턴 : message:channel:%d:seq
  • INCR 연산으로 원자적 증가 → 동시성 안전
  • Redis 장애 시 Optional.empty() 반환 (예외 처리)
  • peek() 기능은 제거하거나 옵션으로 제공

 

🗄 3. DB 스키마 변경

  • 메시지 테이블에 channel_id 컬럼 추가
  • message_seq + channel_id → 복합 PK로 변경
  • 오토인크리먼트 제거 → 외부 발급 시퀀스 값 사용
  • 엔티티를 IdClass 기반 복합키 구조로 재설계
  • DTO 수정 : MessageSeqId, MessageNotification 등 → 클라이언트에 시퀀스 전달 가능하게 변경

 

🔄 4. 메시지 쓰기 흐름

  1. 클라이언트 쓰기 요청 수신
  2. MessageSeqIdGenerator.getNext(channelId) 호출
  3. 값 존재 시 → 메시지 DTO에 세팅 → DB 저장 → 클라이언트 전송
  4. 실패 시 예외 로그 및 쓰기 실패 정책 적용

 

🧪 5. 테스트 과정

  • 로컬 테스트 : Postman + Redis Insight 활용
  • 채널별 독립 시퀀스 증가 확인
  • Redis 재시작 후에도 AOF 설정 덕분에 값 복구 확인
  • 통합 테스트 : 인증 서버 별도 구동 필요
  • 클라이언트 구조 수정 → 메시지 노티피케이션 정상 동작 확인

 

📌 6. 다음 단계 계획

  • ACK/재전송 처리
  • 메시지 순서 보정 로직
  • Redis 클러스터 구성
  • 장애 복구 전략 마련
  • 대량 트래픽 대비 튜닝 & 모니터링 적용

 

⚠️ 7. 운영 시 유의사항

  • 복합 PK 마이그레이션 리스크
    • 정합성 유지 및 롤링 배포 전략 필수
  • Redis 단일 장애점 → DB 폴백, 범위 예약, 오프라인 큐 복구 전략 필요
  • 성능
    • INCR는 빠르지만 네트워크 지연·동시성 병목 가능
    • Redis 명령량·레이턴시·AOF 상태 모니터링
    • 필요 시 샤딩·클러스터 전환 고려
  • 시퀀스 값 증가 → 키 관리·백업 정책 필요

 

🔍 대안

  • Kafka 사용
  • DB 시퀀스 테이블
  • Redis 샤드별 범위 할당

 

  • 실시간 채팅에서 순서 보장은 사용자 경험과 데이터 일관성의 핵심이며, Redis로 빠르게 검증한 뒤, 장애·확장성 시나리오를 단계적으로 보완하는 접근이 현실적입니다.
  • 또한 운영 중 발생 가능한 시퀀스 충돌·누락에 대비해 충분한 로그·검증 툴을 마련하고, 롱런 관점에서는 시퀀스 값 범위를 모니터링해 포화 위험을 관리해야 합니다.
  • 마지막으로, 테스트 자동화·장애 복구 훈련은 필수이며, 운영 절차를 문서화해 두는 것이 좋습니다.