해결된 질문
작성
·
50
0
안녕하세요.
우선 좋은 강의 만들어주셔서 정말 감사드립니다.
한가지 질문이 있습니다.
만약 spring boot 이용해서 stomp 프로토콜을 이용해서 채팅 서비스를 구축 한다고 하였을 때
특정 사용자가 최초 웹소켓 connection 연결 후 해당 웹소켓 서버가 재배포 했을때 고려해야 될 상황이 있습니다.
그럼 프론트 서버에서는 기존에 연결되었던 프론트 서버 정보는 모두 삭제가 될텐데요.
이렇게 된다고 하면 사용자는 채팅 페이지에서 채팅 서비스가 멈춤 현상이 발생 할 것 같습니다.
이것을 해결하기 위해
특정 프론트 서버 정보는 백엔드 서버 메모리에 저장 하는 것보다 외부 서버에 (Ex> Redis) 관리 해야 할까요?
답변 2
1
안녕하세요 리나님.
일단, 실시간 통신서비스에서 사용자 세션객체를 DB(redis, rdb 등)에 저장하는 것은 기본적으로 스프링의 객체이기에 객체그대로를 저장하는것은 불가능합니다. 우회적인 방법으로 ip정보등을 추출해서 저장하는게 가능할지는 모르겠으나, 일반적이지는 않은것 같아요.
그러면 말씀해주신대로 서버 배포 이후에 재시작과정에서 사용자 세션이 유실이 될텐데, 어떤 대안이 현실적일지를 생각해보면, 프론트엔드 코드로서 서버와의 연결이 끊기게 되면 자동으로 retry하는게 가장 현실적이고 효율적일것 같습니다.
실시간통신은 프론트와 백엔드 모두에서 세심하게 연결을 맺고, 적절하게 끊어주고, 문제상황에서 연결을 맺는 retry하는 코드가 충분히 고려되어 설계되어야 합니다. 그래서 결론은 프론트엔드와 협업하여 연결이 끊길수 있는 상황을 고려하여 다시 retry하는 식의 코드를 삽입하여 사용자가 인지하지 못한상태에서 서버와의 연결이 다시 맺어지도록 하는게 최선일것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 리나님.
웹소켓 서버를 재배포할 때의 사용자 연결 문제에 대한 질문을 주셨습니다. 서버가 재배포되면 기존의 연결이 모두 끊어지므로, 이런 상황에서 사용자 경험을 유지하기 위한 방법들에 대해 설명드리겠습니다.
자동 재연결:
Retry
전략을 사용하여 일정 시간 간격으로 서버에 재접속을 시도하게 만들 수 있습니다. 클라이언트 라이브러리에서 기본적으로 제공하는 SockJS
를 통해 이를 쉽게 처리할 수 있습니다.스테이트리스 혹은 세션 유지:
로드 밸런서 활용:
서버에서의 Graceful Shutdown:
이와 관련된 내용과 유사한 질문을 다룬 게시물을 아래 소개 드립니다:
- 웹소켓 연결 중단 시 처리 방법
위 방법들은 모두 서버 재시작 시 사용자의 편의성을 보장하고 시스템의 견고성을 높이는 데 기여할 수 있습니다. 각 솔루션의 장단점과 팀의 요구사항을 고려하여 적절히 선택하시기 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.