[FIX] 채팅 신뢰성 개선 - 멱등성 2단계 상태, DLQ 크기 제한, lastMessage 정밀도, 논리 실패 메트릭 (#317)#320
[FIX] 채팅 신뢰성 개선 - 멱등성 2단계 상태, DLQ 크기 제한, lastMessage 정밀도, 논리 실패 메트릭 (#317)#3201000hyehyang merged 3 commits intodevfrom
Conversation
Summary of ChangesHello @1000hyehyang, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 Pull Request는 채팅 시스템의 신뢰성과 관측성을 향상시키기 위한 네 가지 주요 개선 사항을 포함합니다. 이벤트 멱등성 처리 로직을 2단계 상태 머신으로 고도화하여 잠재적인 메시지 유실을 방지하고, DLQ의 메모리 사용량을 효율적으로 관리합니다. 또한, 채팅방의 마지막 메시지 업데이트 로직을 개선하여 최신성 판단의 정확도를 높였으며, 시스템 메시지 전송 과정에서 발생하는 논리적 실패에 대한 가시성을 확보하여 문제 진단 및 대응 능력을 강화했습니다. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
안녕하세요. 채팅 시스템의 신뢰성과 관측성을 개선하기 위한 변경 사항 잘 보았습니다. 이번 PR은 중요한 이슈들을 해결하고 있어 시스템 안정성에 크게 기여할 것으로 보입니다.
주요 변경 사항에 대한 제 생각은 다음과 같습니다:
- 2단계 멱등성 처리:
IN_PROGRESS와PROCESSED상태를 분리하여 프로세스 다운 시 메시지 유실을 방지하는 아이디어는 매우 훌륭합니다. TTL을 다르게 설정하여 안정성과 재처리 가능성을 모두 확보한 점이 인상적입니다. - DLQ 크기 제한:
LTRIM을 사용하여 Redis 메모리가 무한정 증가하는 것을 막은 것은 운영 안정성을 위한 필수적인 조치입니다. - lastMessage 정밀도 향상:
lastMessageId를 타이브레이커로 사용하여 동일 타임스탬프 문제를 해결한 것은 엣지 케이스를 잘 처리한 좋은 예입니다. - 논리 실패 메트릭 추가: Micrometer를 사용하여 논리적 실패를 추적할 수 있게 되어 시스템 관측성이 크게 향상될 것입니다.
전반적으로 매우 신중하고 완성도 높은 수정이라고 생각합니다. 코드 개선을 위해 몇 가지 작은 제안을 리뷰 코멘트로 남겼으니 확인 부탁드립니다. 수고하셨습니다!
Summary
채팅 시스템에서 발견된 신뢰성·관측성 이슈 4가지를 수정했습니다.
chat:dlq에 RPUSH 후 LTRIM을 적용해 최대 10,000건만 유지lastMessageAt시 비교 불가 문제를(lastMessageAt, lastMessageId)튜플 비교로 해결chat.system_message.logical_failure로 eventType, reason 태그 기반 관측 가능Changes
ProcessedEventStore / RedisProcessedEventStore
markIfNotProcessed(eventId, inProgressTtl): IN_PROGRESS 상태로 선점, 짧은 TTL(3분)markAsProcessed(eventId, processedTtl): PROCESSED 상태로 승격, 긴 TTL(6시간)FailedEventDlq
RPUSH후LTRIM으로 최근 10,000건만 유지MAX_DLQ_SIZE = 10_000상수 추가ChatRoomRepository
updateLastMessageIfNewerWHERE 조건에(r.lastMessageAt = :messageAt AND r.lastMessageId < :messageId)타이브레이크 추가SystemMessageRetrySender
IN_PROGRESS_TTL(3분),PROCESSED_TTL(6시간) 상수 분리chat.system_message.logical_failureCounter 기록 (eventType, reason 태그)Type of Change
Related Issues
Closes #317
참고 사항