작성
·
233
·
수정됨
0
안녕하세요.
해당 강의에서는 채팅 서버가 하나지만
만약 채팅서버를 2개 운영한다고 가정했을때 (A.jar, B.jar)
배포를 위해 A jar 를 내리고 다시 올릴때 서버가 내려가기전 A jar 의 socket 객체정보를 B jar 로 보내려면 어떤 방법을 사용해야할까요?
socket 을 직렬화해서 보내려고 했는데 socket 은 제가 만든 클래스가 아니다보니 Serializable 를 상속받지못해 불가능할것같은데.. 실무에서는 채팅 이중화서버운영 무중단 배포를 어떤식으로 하는지 궁금합니다 ㅠㅠ ..
강의보다 심화된 내용이지만 해당 부분에 대한 지식을 쌓기가 힘들어서 글을 작성하게 되었습니다.
감사합니다.
답변 2
0
socket 정보를 왜 저장하죠, tcp 연결로서 연결을 보장하는 socket은 말그대로 연결할때 생성되는 존재니까, a를 내리고 b를 올리면 그냥 serverSocket에서 accept() 하고 그때 새로운 socket을 받아 사용하면 되죠
0
안녕하세요, 인프런 AI 인턴입니다. backendman님!
채팅서버 이중화를 위해 서버 간의 socket
정보를 공유하고자 하시는 군요. 이와 같은 시나리오에서는 일반적으로 직접적으로 socket
객체를 전송하기보다는 다른 방법들이 주로 사용됩니다. socket
객체는 자체적으로 Serializable
을 구현하지 않기 때문에 이를 직렬화하여 직접 이관하는 것은 어렵습니다.
실무에서 채팅 서버 이중화 및 무중단 배포를 구현하는 방법 중 몇 가지를 소개드리겠습니다:
세션 정보 관리:
채팅 서버 간의 세션 상태를 공유하기 위해 보통 Redis와 같은 인메모리 데이터베이스를 사용하여 세션 정보를 중앙에서 관리합니다. 세션 키를 가지고 어느 서버와 연결되어 있는지 정보를 유지하거나 필요 시 다른 서버에서 해당 사용자의 세션을 복구할 수 있습니다.
로드 밸런싱 및 상태 복사:
로드 밸런서를 사용하여 사용자 요청을 다수의 서버로 분배하면서, 각 서버가 중단될 때 클라이언트 세션 상태를 복제하거나 재구성할 수 있도록 하는 방법입니다. 서버는 마지막 활동 상태를 로그에 기록하거나, 필요 시 해당 상태를 다른 서버로 전송할 수 있습니다.
멀티캐스트/브로드캐스트:
특정 메시지를 네트워크의 모든 서버에 보내 세션 정보를 동기화하는 방법입니다.
WebSocket 메시지 브로커:
별도의 메시지 브로커(예: Kafka, RabbitMQ 등)를 사용하여 각 서버가 메시지를 게시하고 구독하도록 하여 채팅 메시지를 관리합니다. 이 방식은 서버 간 상태 동기화뿐만 아니라 메시지 전달의 일관성을 높이는데 유리합니다.
이러한 방식을 통해 채팅 서버의 무중단 배포와 확장을 달성할 수 있으며, 서버 다운타임이나 배포 시에도 안정적으로 연결을 유지할 수 있습니다.
유사한 문제를 다루는 기존 게시물들을 참고하시는 것도 좋습니다:
- 소켓통신에 대해서 질문드립니다. - 실무에서 소켓 통신의 활용에 대한 질문입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.