발표를 보고 정리한 포스트
소켓 통신과 HTTP 통신의 차이점 간단하게 짚기
Node.js와 같은 비동기 서버 프레임 (Node.js의 자바버전 느낌)
Hazelcast - Redis와 비슷한 분산환경에서 데이터 공유를 위한 In-Memory Data Grid 참고 블로그
멀티 캐스트 - 한번의 전송으로 다수의 호스트에 메시지 전송 참고 블로그
-> 인프라 독립적으로 새롭게 개발에 착수하게 된다.
"어떻게 소켓 연결이라는 상태를 가지는 서버를 스케일 아웃 할 수 있을까??"
-> Redis Pub/Sub을 활용한다.
특정 고객이 특정 기사에게 메시지를 보내는 상황
User Cllient가 Instance 1에 메세지 전송 -> Instance1 이 Redis에 메세지 Publish -> Driver와 연결된 Instance2가 메세지 수신 -> Instance2가 Driver Client로 메세지 전송
특정 내부서버가 특정 기사에게 메세지를 보내고 싶은 상황
내부서버가 임의의 인스턴스에 메시지 -> 인스턴스가 레디스로 Publish -> Driver Client와 연결된 인스턴스가 메세지 수신 -> Driver Client로 메세지 전송
해당 구조 구현을 위해 커넥션 서버는 두 가지 종류의 연결상태 데이터를 관리해야함
Key에는 클라이언트 ID를, Value에는 서버 호스트 네임을
Key에 클라이언트 아이디를 Value에는 클라이언트와 연결된 소켓 객체 레퍼런스 값을
커넥션 서버의 라이프 사이클
각 인스턴스는 시작시 자신의 호스트네임과 동일한 레디스 채널을 구독함
-> 자신의 호스트네임으로 Publish 되는 메시지를 처리할 수 있게됨
소켓 연결이 수립되는 시점에 Local Map, Global Map 데이터가 생성된다.
소켓 연결 종료시 인스턴스는 해당 클라이언트의 Local Map과 Global Map의 데이터를 제거한다.
업데이트를 위해 롤링 배포를 진행할때 이전 버전의 인스턴스는 종료된다.
종료시 해당 인스턴스를 로드밸런서와 같은 앞단의 네트워크 라우팅 대상에서 제외시킨다.
이렇게 처리되지 않았을 경우 종료되는 과정 중에도 새로운 소켓 연결들이 수립되면서 비정상적인 동작이나 메세지 유실이 발생가능
인스턴스가 종료되면 인스턴스는 자신과 연결된 모든 클라이언트들에 대한 글로벌맵 데이터를 제거하고 소켓 연결 모두 해제 -> 종료
O2O 서비스 특성상 네트워크 연결이 좋지 않을 수 있다(소켓 세션 해제 발생 다수). 예외 상황과 해결법
Client -> Server 전송실패시
소켓 연결 재시도
Server -> Client
1. 글로벌맵 조회 실패시
2. 글로벌맵 조회는 성공했지만 로컬맵 조회 실패시
3. 로컬맵까지 조회 성공했지만 소켓 연결이 해제되여 I/O Exception이 발생할 경우
소켓 메시지 대신 안드로이스 IOS에 (GCM/APNS) 푸시메세지로 전송 보장
푸시 알림을 위한 구글 밑 애플의 메시징 서비스
소켓 연결을 끊겼는데 데이터가 남아있는경우 메세지 전송이 처리될 수 있음
메모리 릭, 불필요한 리소스 사용 -> 스케줄링으로 데이터 삭제
소켓 서버 : 자바NIO
고객 기사 클라이언트 3만개를 연결시켜 5분동안 테스트
인터페이스가동일해서 DNS 스위칭만 했다.