강의

멘토링

로드맵

Inflearn brand logo image

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

backendman님의 프로필 이미지
backendman

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

네트워크 프로그램6 - 자원 정리3

채팅서버가 2개일때 서버간 socketManager 공유방법

작성

·

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을 구현하지 않기 때문에 이를 직렬화하여 직접 이관하는 것은 어렵습니다.

실무에서 채팅 서버 이중화 및 무중단 배포를 구현하는 방법 중 몇 가지를 소개드리겠습니다:

  1. 세션 정보 관리:
    채팅 서버 간의 세션 상태를 공유하기 위해 보통 Redis와 같은 인메모리 데이터베이스를 사용하여 세션 정보를 중앙에서 관리합니다. 세션 키를 가지고 어느 서버와 연결되어 있는지 정보를 유지하거나 필요 시 다른 서버에서 해당 사용자의 세션을 복구할 수 있습니다.

  2. 로드 밸런싱 및 상태 복사:
    로드 밸런서를 사용하여 사용자 요청을 다수의 서버로 분배하면서, 각 서버가 중단될 때 클라이언트 세션 상태를 복제하거나 재구성할 수 있도록 하는 방법입니다. 서버는 마지막 활동 상태를 로그에 기록하거나, 필요 시 해당 상태를 다른 서버로 전송할 수 있습니다.

  3. 멀티캐스트/브로드캐스트:
    특정 메시지를 네트워크의 모든 서버에 보내 세션 정보를 동기화하는 방법입니다.

  4. WebSocket 메시지 브로커:
    별도의 메시지 브로커(예: Kafka, RabbitMQ 등)를 사용하여 각 서버가 메시지를 게시하고 구독하도록 하여 채팅 메시지를 관리합니다. 이 방식은 서버 간 상태 동기화뿐만 아니라 메시지 전달의 일관성을 높이는데 유리합니다.

이러한 방식을 통해 채팅 서버의 무중단 배포와 확장을 달성할 수 있으며, 서버 다운타임이나 배포 시에도 안정적으로 연결을 유지할 수 있습니다.

유사한 문제를 다루는 기존 게시물들을 참고하시는 것도 좋습니다:
- 소켓통신에 대해서 질문드립니다. - 실무에서 소켓 통신의 활용에 대한 질문입니다.

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

backendman님의 프로필 이미지
backendman

작성한 질문수

질문하기