인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

minjun님의 프로필 이미지

작성한 질문수

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

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

작성

·

72

0

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

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

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

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

 

답변 2

0

bradkim님의 프로필 이미지
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:

    • 메시지가 생성될 때마다 고유의 논리적인 순서 값을 추가로 설정하여 이를 기준으로 정렬 또는 검증하는 방법도 고려할 수 있습니다.

관련 사례나 방법론에 대한 유사한 질문이 존재하는 경우, 이를 통해 더 많은 정보를 얻으셔서 프로젝트에 도움이 되시기를 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

minjun님의 프로필 이미지

작성한 질문수

질문하기