메시지 저장순서에 대한 질문입니다.
117
작성한 질문수 18
안녕하세요 수업을 바탕으로 프로젝트 적용중입니다.
프론트에서 채팅입력하면 백엔드의 연결된 소켓에서 이를 redis 로 publish 하고 이때 같이 채팅메시지를 db에 저장하는 방식으로 구현했습니다.
나중에 채팅방에 다시 입장하는 경우 채팅 저장 날짜를 기반으로 일부 가져오려하니 초까지 같은 경우 순서가 엉키는 현상이 발생하는데 auto_increment 로 저장한 pk 를 순서로 가져와도 될까요?
redis 는 싱글스레드이지만 websocket 가 병렬처리되면 결국 pk 순서가 실제 순서를 보장할 수 있을까요?
답변 2
0
1.pk를 순서로 저장해도 무관할것 같습니다.
2.redis와 상관없이 spring이 멀티스레드를 처리하므로 메시지가 순간적으로 동시에 가깝게 발행이 될수 있다고 보여집니다. 그 과정에서 redis를 통한 pub/sub 등 메시지 발행 과정이 상대적으로 긴 흐름으로 이어지기에 실질적으로는 사용자가 메시지를 발송한 순서를 100% 보장한다고 보기는 어려울수도 있습니다. 그러나, 서버의 물리적 이슈가 있지 않는한 논리적으로는 메시지 발행순서가 보장되는것이 맞기에 이를 대비하는 등의 코드나 아키텍처를 구성할 필요는 없어 보입니다.
0
안녕하세요, 인프런 AI 인턴입니다. minjun님.
현재 프로젝트에서 채팅 메시지를 저장할 때의 순서 문제에 대해 질문해 주셨습니다. 특히, 초 단위로 같은 시간에 여러 메시지가 저장될 때 순서가 엉키는 문제와 이를 해결하기 위한 접근 방식에 대해 문의하셨습니다.
메시지 순서 보장 전략
Auto Increment PK 사용 여부:
- Auto Increment를 사용하는 PK 값은 보통 데이터베이스에 저장된 순서대로 증가하기 때문에, 데이터베이스에 저장된 순서로 레코드를 다시 가져오는 데 유용할 수 있습니다.
- 그러나 만약 Redis의 Pub/Sub 구조에서 메시지가 다소 최신 값에 기반해 중간에 누락되거나 순서가 어긋날 가능성을 염려하는 경우, 단순히 PK를 사용하는 것만으로는 충분하지 않을 수 있습니다.
- Auto Increment를 사용하는 PK 값은 보통 데이터베이스에 저장된 순서대로 증가하기 때문에, 데이터베이스에 저장된 순서로 레코드를 다시 가져오는 데 유용할 수 있습니다.
타임스탬프와 PK의 조합:
- 메시지를 DB에 저장할 때, 타임스탬프와 함께 사용하여 정보를 저장하는 것도 한 가지 방법입니다. 타임스탬프는 기본적으로 저장 순서에 대한 일차적인 기준을 제공하고, 초 단위로 겹치는 경우 PK를 통한 보완적인 정렬 기준을 사용할 수 있습니다.
- 메시지를 DB에 저장할 때, 타임스탬프와 함께 사용하여 정보를 저장하는 것도 한 가지 방법입니다. 타임스탬프는 기본적으로 저장 순서에 대한 일차적인 기준을 제공하고, 초 단위로 겹치는 경우 PK를 통한 보완적인 정렬 기준을 사용할 수 있습니다.
Thread/Process-Safe Ordering:
- WebSocket 메시징이 병행 처리되더라도, 데이터베이스 엑세스 자체가 순차적이므로 Redis에서 메시지를 발행하는 순서(싱글 스레드의 특성)를 어느 정도 유지할 수는 있지만, IO 지연 등에 의해 메시지 저장 순서가 완벽하게 보장되지는 않을 수 있습니다.
- WebSocket 메시징이 병행 처리되더라도, 데이터베이스 엑세스 자체가 순차적이므로 Redis에서 메시지를 발행하는 순서(싱글 스레드의 특성)를 어느 정도 유지할 수는 있지만, IO 지연 등에 의해 메시지 저장 순서가 완벽하게 보장되지는 않을 수 있습니다.
Alternative: Logical Sequence:
- 메시지가 생성될 때마다 고유의 논리적인 순서 값을 추가로 설정하여 이를 기준으로 정렬 또는 검증하는 방법도 고려할 수 있습니다.
- 메시지가 생성될 때마다 고유의 논리적인 순서 값을 추가로 설정하여 이를 기준으로 정렬 또는 검증하는 방법도 고려할 수 있습니다.
관련 사례나 방법론에 대한 유사한 질문이 존재하는 경우, 이를 통해 더 많은 정보를 얻으셔서 프로젝트에 도움이 되시기를 바랍니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
ERD 질문
0
54
2
StompHandler 관한 질문
0
80
2
리프레시 토큰은 알아서 구현하면 되는건가요??
0
79
2
cors, csrf 직접 구현
0
65
1
JWT 필터구현
0
98
2
강의 잘듣고 있습니다. 혹시 다음 강의 계획은 없으신가요?
0
57
1
STOMP 동작 과정 질문
0
48
1
chain.doFilter()
0
45
1
자바 21로 소스 작성해도 되나요?
0
60
2
메시지 브로커 선택에 관한 질문
0
65
2
WebSocket과 Spring Security 질문
0
81
2
추가 커스텀 구현 질문 있습니다.
0
61
2
connect와 동시에 구독하는데 구독 검증이 꼭 필요한가요?
0
97
2
저도 동일한 질문인데
0
78
3
token이 필요한 엔드포인트에 의도적으로 토큰 누락시 대처
0
67
2
수업자료가 왜 다 나눠져있나요?
0
78
2
메시지 전송 시 검증
0
61
2
JWT 생성 시 subject 설정에 대한 질문
0
158
3
StompHandler 질문 있습니다.
0
82
2
앱 서비스일 경우
0
84
2
웹소켓 서버 재배포시 고려해야 할 상황 질문
0
107
2
배포 오류 질문
0
124
2
/connect 경로에 대한 토큰 검증의 필요성
0
77
1
JwtTokenProvider 작성중 오류 발생으로 문의드립니다.
0
97
2





