본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
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. 메시지 쓰기 흐름
- 클라이언트 쓰기 요청 수신
- MessageSeqIdGenerator.getNext(channelId) 호출
- 값 존재 시 → 메시지 DTO에 세팅 → DB 저장 → 클라이언트 전송
- 실패 시 예외 로그 및 쓰기 실패 정책 적용
🧪 5. 테스트 과정
- 로컬 테스트 : Postman + Redis Insight 활용
- 채널별 독립 시퀀스 증가 확인
- Redis 재시작 후에도 AOF 설정 덕분에 값 복구 확인
- 통합 테스트 : 인증 서버 별도 구동 필요
- 클라이언트 구조 수정 → 메시지 노티피케이션 정상 동작 확인
📌 6. 다음 단계 계획
- ACK/재전송 처리
- 메시지 순서 보정 로직
- Redis 클러스터 구성
- 장애 복구 전략 마련
- 대량 트래픽 대비 튜닝 & 모니터링 적용
⚠️ 7. 운영 시 유의사항
- 복합 PK 마이그레이션 리스크
- 정합성 유지 및 롤링 배포 전략 필수
- Redis 단일 장애점 → DB 폴백, 범위 예약, 오프라인 큐 복구 전략 필요
- 성능
- INCR는 빠르지만 네트워크 지연·동시성 병목 가능
- Redis 명령량·레이턴시·AOF 상태 모니터링
- 필요 시 샤딩·클러스터 전환 고려
- 시퀀스 값 증가 → 키 관리·백업 정책 필요
🔍 대안
- Kafka 사용
- DB 시퀀스 테이블
- Redis 샤드별 범위 할당
- 실시간 채팅에서 순서 보장은 사용자 경험과 데이터 일관성의 핵심이며, Redis로 빠르게 검증한 뒤, 장애·확장성 시나리오를 단계적으로 보완하는 접근이 현실적입니다.
- 또한 운영 중 발생 가능한 시퀀스 충돌·누락에 대비해 충분한 로그·검증 툴을 마련하고, 롱런 관점에서는 시퀀스 값 범위를 모니터링해 포화 위험을 관리해야 합니다.
- 마지막으로, 테스트 자동화·장애 복구 훈련은 필수이며, 운영 절차를 문서화해 두는 것이 좋습니다.