카카오 T 대리 신규 커넥션 서버 개발기

유재희·2023년 3월 12일
0

발표 영상 링크

발표를 보고 정리한 포스트
소켓 통신과 HTTP 통신의 차이점 간단하게 짚기

커넥션 서버란?

  • 고객, 기사, 내부 서버간 양방향 소켓 통신을 담당하는 서버

통신 예시

  1. 고객, 기사 클라이언트간 메시지 전달
  2. 기사 클라이언트의 실시간 위치 갱신
  3. 서버에서 클라이언트로의 푸시 메세지 전달

Vert.x 프레임워크란?

Node.js와 같은 비동기 서버 프레임 (Node.js의 자바버전 느낌)

Hazelcast?, UDP 멀티캐스트?

Hazelcast - Redis와 비슷한 분산환경에서 데이터 공유를 위한 In-Memory Data Grid 참고 블로그
멀티 캐스트 - 한번의 전송으로 다수의 호스트에 메시지 전송 참고 블로그

-> 인프라 독립적으로 새롭게 개발에 착수하게 된다.

  • 내부 서버로 부터 HTTP 통신.
  • 외부 클라이언트들과 TCP Socket, Web Socket 통신이 가능해야 한다.
  • 기존 서버의 실제 운영 로그를 바탕으로 확인해본 결과 동시에 최대 3만개의 소켓 연결이 가능
  • 기사 위치 갱신을 위해 7000 TPS 처리
  • 인프라 독립적
  • 스케일 아웃

"어떻게 소켓 연결이라는 상태를 가지는 서버를 스케일 아웃 할 수 있을까??"
-> Redis Pub/Sub을 활용한다.

예시

  1. 특정 고객이 특정 기사에게 메시지를 보내는 상황
    User Cllient가 Instance 1에 메세지 전송 -> Instance1 이 Redis에 메세지 Publish -> Driver와 연결된 Instance2가 메세지 수신 -> Instance2가 Driver Client로 메세지 전송

  2. 특정 내부서버가 특정 기사에게 메세지를 보내고 싶은 상황
    내부서버가 임의의 인스턴스에 메시지 -> 인스턴스가 레디스로 Publish -> Driver Client와 연결된 인스턴스가 메세지 수신 -> Driver Client로 메세지 전송

레디스가 있어서 스케일 아웃이 가능해진건가?

해당 구조 구현을 위해 커넥션 서버는 두 가지 종류의 연결상태 데이터를 관리해야함

Key에는 클라이언트 ID를, Value에는 서버 호스트 네임을

Key에 클라이언트 아이디를 Value에는 클라이언트와 연결된 소켓 객체 레퍼런스 값을

기본 동작 과정


커넥션 서버의 라이프 사이클


각 인스턴스는 시작시 자신의 호스트네임과 동일한 레디스 채널을 구독함
-> 자신의 호스트네임으로 Publish 되는 메시지를 처리할 수 있게됨

  1. 클라이언트는 임의의 서버 인스턴스와 3-Way Handshake로 연결
  2. 서버 인스턴스는 해당 클라이언트 ID를 Key로 생성된 소켓 객체를 Value로 하여 LocalMap에 데이터 생성.
  3. 클라이언트 ID를 Key로 인스턴스 호스트네임을 Value로 하여 글로벌 맵에 데이터 추가.

소켓 연결이 수립되는 시점에 Local Map, Global Map 데이터가 생성된다.

  1. User 가 특정 Driver ID를 Key로 메세지를 전송한다.
  2. Instace1이 해당 Driver ID를 Key로 Global Map을 조회하여 Driver와 연결된 Instance2 호스트네임을 가져온다.
  3. Instance2의 Redis Pub/Sub 채널로 메시지를 Publish 한다.
  4. Instance2는 구독중인 채널에서 메시지를 수신한다.
  5. Local Map 데이터를 기반으로 해당 Driver와의 Socket Object값을 가져오고 해당 소켓 연결을 통해 Driver Client에 메시지를 전송한다.

소켓 연결 종료시 인스턴스는 해당 클라이언트의 Local Map과 Global Map의 데이터를 제거한다.

업데이트를 위해 롤링 배포를 진행할때 이전 버전의 인스턴스는 종료된다.
종료시 해당 인스턴스를 로드밸런서와 같은 앞단의 네트워크 라우팅 대상에서 제외시킨다.

이렇게 처리되지 않았을 경우 종료되는 과정 중에도 새로운 소켓 연결들이 수립되면서 비정상적인 동작이나 메세지 유실이 발생가능

인스턴스가 종료되면 인스턴스는 자신과 연결된 모든 클라이언트들에 대한 글로벌맵 데이터를 제거하고 소켓 연결 모두 해제 -> 종료

Fallback


O2O 서비스 특성상 네트워크 연결이 좋지 않을 수 있다(소켓 세션 해제 발생 다수). 예외 상황과 해결법

  1. Client -> Server 전송실패시
    소켓 연결 재시도

  2. Server -> Client
    1. 글로벌맵 조회 실패시
    2. 글로벌맵 조회는 성공했지만 로컬맵 조회 실패시
    3. 로컬맵까지 조회 성공했지만 소켓 연결이 해제되여 I/O Exception이 발생할 경우
    소켓 메시지 대신 안드로이스 IOS에 (GCM/APNS) 푸시메세지로 전송 보장

GCM? APNS?

푸시 알림을 위한 구글 밑 애플의 메시징 서비스

소켓 연결을 끊겼는데 데이터가 남아있는경우 메세지 전송이 처리될 수 있음
메모리 릭, 불필요한 리소스 사용 -> 스케줄링으로 데이터 삭제

소켓 서버 : 자바NIO

고객 기사 클라이언트 3만개를 연결시켜 5분동안 테스트

인터페이스가동일해서 DNS 스위칭만 했다.

DNS 스위칭?

profile
몰라요

0개의 댓글