inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹소켓/STOMP 채팅서비스(spring, vue, redis)

메시지 저장순서에 대한 질문입니다.

117

minjun

작성한 질문수 18

0

안녕하세요 수업을 바탕으로 프로젝트 적용중입니다.

프론트에서 채팅입력하면 백엔드의 연결된 소켓에서 이를 redis 로 publish 하고 이때 같이 채팅메시지를 db에 저장하는 방식으로 구현했습니다.

나중에 채팅방에 다시 입장하는 경우 채팅 저장 날짜를 기반으로 일부 가져오려하니 초까지 같은 경우 순서가 엉키는 현상이 발생하는데 auto_increment 로 저장한 pk 를 순서로 가져와도 될까요?

redis 는 싱글스레드이지만 websocket 가 병렬처리되면 결국 pk 순서가 실제 순서를 보장할 수 있을까요?

 

spring-boot websocket stomp-websocket pubsub vue-3

답변 2

0

bradkim

1.pk를 순서로 저장해도 무관할것 같습니다.

2.redis와 상관없이 spring이 멀티스레드를 처리하므로 메시지가 순간적으로 동시에 가깝게 발행이 될수 있다고 보여집니다. 그 과정에서 redis를 통한 pub/sub 등 메시지 발행 과정이 상대적으로 긴 흐름으로 이어지기에 실질적으로는 사용자가 메시지를 발송한 순서를 100% 보장한다고 보기는 어려울수도 있습니다. 그러나, 서버의 물리적 이슈가 있지 않는한 논리적으로는 메시지 발행순서가 보장되는것이 맞기에 이를 대비하는 등의 코드나 아키텍처를 구성할 필요는 없어 보입니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. minjun님.

현재 프로젝트에서 채팅 메시지를 저장할 때의 순서 문제에 대해 질문해 주셨습니다. 특히, 초 단위로 같은 시간에 여러 메시지가 저장될 때 순서가 엉키는 문제와 이를 해결하기 위한 접근 방식에 대해 문의하셨습니다.

메시지 순서 보장 전략

  1. Auto Increment PK 사용 여부:

    • Auto Increment를 사용하는 PK 값은 보통 데이터베이스에 저장된 순서대로 증가하기 때문에, 데이터베이스에 저장된 순서로 레코드를 다시 가져오는 데 유용할 수 있습니다.
    • 그러나 만약 Redis의 Pub/Sub 구조에서 메시지가 다소 최신 값에 기반해 중간에 누락되거나 순서가 어긋날 가능성을 염려하는 경우, 단순히 PK를 사용하는 것만으로는 충분하지 않을 수 있습니다.
  2. 타임스탬프와 PK의 조합:

    • 메시지를 DB에 저장할 때, 타임스탬프와 함께 사용하여 정보를 저장하는 것도 한 가지 방법입니다. 타임스탬프는 기본적으로 저장 순서에 대한 일차적인 기준을 제공하고, 초 단위로 겹치는 경우 PK를 통한 보완적인 정렬 기준을 사용할 수 있습니다.
  3. Thread/Process-Safe Ordering:

    • WebSocket 메시징이 병행 처리되더라도, 데이터베이스 엑세스 자체가 순차적이므로 Redis에서 메시지를 발행하는 순서(싱글 스레드의 특성)를 어느 정도 유지할 수는 있지만, IO 지연 등에 의해 메시지 저장 순서가 완벽하게 보장되지는 않을 수 있습니다.
  4. 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