Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

kakao
December 09, 2022

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

#NetworkSocket

본 세션에서는 카카오 T 대리 서비스에서 소켓 통신을 담당하는 커넥션 서버를 왜 새롭게 개발하게 되었는지 말씀드리고, 새롭게 개발한 커넥션 서버의 설계와 그 구현 방법에 대해서 소개하겠습니다. 그리고 개발 과정에서 마주했던 문제들과 그 해결책들을 공유드리겠습니다.

발표자 : jay.sohn
카카오모빌리티에서 카카오 T 대리 서비스의 백엔드 개발을 맡고 있는 제이입니다.

kakao

December 09, 2022
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1. 카카오 T 대리 신규 커넥션 서버 개발기 손정연 Jay.sohn 카카오모빌리티

    Copyright 2022. Kakao Corp. All rights reserved. Redistribution or public display is not permitted without written permission from Kakao. if(kakao)2022
  2. 사용 중이던 데이터센터의 지원 종료 - 기존 커넥션 서버는 Vert.x

    프레임워크 사용 중 새롭게 개발한 이유 7&359
  3. 사용 중이던 데이터센터의 지원 종료 - 기존 커넥션 서버는 Vert.x

    프레임워크 사용 중 - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존 새롭게 개발한 이유 7&359 )";&-$"45
  4. 사용 중이던 데이터센터의 지원 종료 - 기존 커넥션 서버는 Vert.x

    프레임워크 사용 중 - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존 - 다른 데이터센터에서는 지원 불가 새롭게 개발한 이유 7&359 )";&-$"45
  5. 사용 중이던 데이터센터의 지원 종료 - 기존 커넥션 서버는 Vert.x

    프레임워크 사용 중 - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존 - 다른 데이터센터에서는 지원 불가 - 버전업? 사용 중인 Vert.x API가 모두 바뀜 새롭게 개발한 이유 7&359 )";&-$"45
  6. - HTTP, TCP Socket, Web Socket 통신 - 최대 30K+

    동시 연결 - 7,000 TPS 요구사항
  7. - HTTP, TCP Socket, Web Socket 통신 - 최대 30K+

    동시 연결 - 7,000 TPS - 인프라 독립적 - 스케일 아웃 요구사항
  8. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF Socket *OTUBODF *OTUBODF/

    . . . $POOFDUJPO %SJWFS $MJFOU Socket *OUFSOBM 4FSWFS HTTP
  9. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  10. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  11. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  12. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  13. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  14. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  15. 기본 구조 3FEJT 1VC4VC 6TFS $MJFOU *OTUBODF *OTUBODF *OTUBODF/ .

    . . $POOFDUJPO %SJWFS $MJFOU *OUFSOBM 4FSWFS Socket Socket HTTP
  16. 글로벌맵 - 클라이언트가 연결된 인스턴스 이름 관리 - 모든 인스턴스가

    공유 - Redis Strings 사용 - (User / Driver ID, Instance Host Name)
  17. - 클라이언트의 소켓 세션 객체 관리 - 각 인스턴스 내부에서만

    사용 - Java ConcurrentHashMap 사용 - (User / Driver ID, Socket Object) 로컬맵
  18. 인스턴스 시작 3FEJT 1VC4VC *OTUBODF *OTUBODF *OTUBODF. . . .

    Subscribe Channel: Instance 1 Subscribe Channel: Instance 2 Subscribe Channel: Instance M
  19. 연결 수립 3FEJT (MPCBM.BQ *OTUBODF. Local Map $MJFOU/ 3 -

    Way Handshake Set (Client N, Socket Object)
  20. 연결 수립 3FEJT (MPCBM.BQ *OTUBODF. Set (Client N, Instance M)

    Local Map $MJFOU/ 3 - Way Handshake Set (Client N, Socket Object)
  21. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) 메시지 전송
  22. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) Key ‘Driver 1’ 메시지 전송
  23. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) Key ‘Driver 1’ Value ‘Instance 2’ 메시지 전송
  24. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) Publish Channel: Instance 2 (Driver 1, Payload) Key ‘Driver 1’ Value ‘Instance 2’ 메시지 전송
  25. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) Publish Channel: Instance 2 (Driver 1, Payload) Key ‘Driver 1’ Value ‘Instance 2’ (Driver 1, Payload) 메시지 전송
  26. 3FEJT (MPCBM.BQ *OTUBODF Local Map 6TFS $MJFOU *OTUBODF 3FEJT 1VC4VC

    %SJWFS $MJFOU (Driver 1, Payload) Publish Channel: Instance 2 (Driver 1, Payload) Key ‘Driver 1’ Value ‘Instance 2’ (Driver 1, Payload) Payload Driver 1’s Socket Object 메시지 전송
  27. 연결 해제 3FEJT (MPCBM.BQ *OTUBODF. Delete (Client N, Instance M)

    Local Map $MJFOU/ Delete (Client N, Socket Object)
  28. 인스턴스 종료 3FEJT (MPCBM.BQ *OTUBODF. $MJFOUT Disconnect Delete (Client ID,

    Instance M) for all clients Exclude from routing targets
  29. 인스턴스 종료 3FEJT (MPCBM.BQ *OTUBODF. $MJFOUT Disconnect Delete (Client ID,

    Instance M) for all clients Terminate Exclude from routing targets
  30. O2O 서비스 특성 상 네트워크 연결이 불안정 1. Client ->

    Server 전송 실패 2. Server -> Client 전송 실패 Fallback
  31. O2O 서비스 특성 상 네트워크 연결이 불안정 1. Client ->

    Server 전송 실패 -> 소켓 재연결 시도 2. Server -> Client 전송 실패 Fallback
  32. O2O 서비스 특성 상 네트워크 연결이 불안정 1. Client ->

    Server 전송 실패 -> 소켓 재연결 시도 2. Server -> Client 전송 실패 - 글로벌맵 조회 실패 - 로컬맵 조회 실패 - 소켓 메시지 전송 실패 Fallback 글로벌맵 조회 로컬맵 조회 소켓 메시지 전송
  33. O2O 서비스 특성 상 네트워크 연결이 불안정 1. Client ->

    Server 전송 실패 -> 소켓 재연결 시도 2. Server -> Client 전송 실패 - 글로벌맵 조회 실패 - 로컬맵 조회 실패 - 소켓 메시지 전송 실패 -> GCM / APNS 푸시 메시지 전송 Fallback 글로벌맵 조회 로컬맵 조회 소켓 메시지 전송 GCM / APNS 푸시 메세지 전송 실패 실패 실패
  34. 소켓 연결이 끊겼는데 글로벌맵, 로컬맵에서 제거되지 않은 경우 1. 글로벌맵

    - 레디스 키-값 만료시간을 180초로 설정 - 클라이언트-서버 메시지 전송이 있을 시 만료시간 갱신 2. 로컬맵 글로벌맵, 로컬맵 TTL(Time to live)
  35. 소켓 연결이 끊겼는데 글로벌맵, 로컬맵에서 제거되지 않은 경우 1. 글로벌맵

    - 레디스 키-값 만료시간을 180초로 설정 - 클라이언트-서버 메시지 전송이 있을 시 만료시간 갱신 2. 로컬맵 - 매 분마다 한 번씩 180초 이상 지난 키-값 제거 및 강제 연결 해제 - 소켓 객체에 최근 클라이언트-서버 메시지 전송 시점 기록 글로벌맵, 로컬맵 TTL(Time to live)
  36. 기술 스택 Spring Boot Redis Pub/Sub Java NIO Spring WebSocket

    Spring MVC Kubernetes D2HUB (사내 Docker 이미지 저장소)
  37. 기술 스택 Spring Boot Redis Pub/Sub Java NIO Spring WebSocket

    Spring MVC Kubernetes D2HUB (사내 Docker 이미지 저장소) Kibana 사내 APM Sentry
  38. 성능 테스트 6TFS  $POOFDUJPO 4FSWFS %SJWFS  . .

    . 6TFS   %SJWFS   nGrinder Agents
  39. 6TFS  $POOFDUJPO 4FSWFS 30,000 Connections Message 1 %SJWFS 

    . . . 6TFS   %SJWFS   Message 15,000 성능 테스트 nGrinder Agents