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

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

kakao
PRO
December 09, 2022

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

#NetworkSocket

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

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

kakao
PRO

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

    View Slide

  2. 커넥션 서버?


    새롭게 개발하게 된 배경


    설계 및 동작 방식


    도입 결과

    View Slide

  3. 카카오 T 대리

    View Slide

  4. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View Slide

  5. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View Slide

  6. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View Slide

  7. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket
    PUSH
    PUSH
    PUSH

    View Slide

  8. 사용 중이던 데이터센터의 지원 종료
    새롭게 개발한 이유

    View Slide

  9. 사용 중이던 데이터센터의 지원 종료


    - 기존 커넥션 서버는 Vert.x 프레임워크 사용 중
    새롭게 개발한 이유
    7&359

    View Slide

  10. 사용 중이던 데이터센터의 지원 종료


    - 기존 커넥션 서버는 Vert.x 프레임워크 사용 중


    - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존
    새롭게 개발한 이유
    7&359
    )";&-$"45

    View Slide

  11. 사용 중이던 데이터센터의 지원 종료


    - 기존 커넥션 서버는 Vert.x 프레임워크 사용 중


    - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존


    - 다른 데이터센터에서는 지원 불가
    새롭게 개발한 이유
    7&359
    )";&-$"45

    View Slide

  12. 사용 중이던 데이터센터의 지원 종료


    - 기존 커넥션 서버는 Vert.x 프레임워크 사용 중


    - Vert.x의 Hazelcast가 UDP 멀티캐스트 기능에 의존


    - 다른 데이터센터에서는 지원 불가


    - 버전업? 사용 중인 Vert.x API가 모두 바뀜
    새롭게 개발한 이유
    7&359
    )";&-$"45

    View Slide

  13. “인프라 독립적인 구조로 새롭게 개발하자!”

    View Slide

  14. 요구사항

    View Slide

  15. - HTTP, TCP Socket, Web Socket 통신
    요구사항

    View Slide

  16. - HTTP, TCP Socket, Web Socket 통신


    - 최대 30K+ 동시 연결


    - 7,000 TPS
    요구사항

    View Slide

  17. - HTTP, TCP Socket, Web Socket 통신


    - 최대 30K+ 동시 연결


    - 7,000 TPS


    - 인프라 독립적


    - 스케일 아웃
    요구사항

    View Slide

  18. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    Socket
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    Socket
    *OUFSOBM


    4FSWFS
    HTTP

    View Slide

  19. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  20. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  21. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  22. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  23. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  24. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  25. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View Slide

  26. 글로벌맵 로컬맵
    (Client ID, Instance Host Name) (Client ID, Socket Object)
    연결 상태 관리

    View Slide

  27. 글로벌맵
    - 클라이언트가 연결된 인스턴스 이름 관리


    - 모든 인스턴스가 공유

    View Slide

  28. 글로벌맵
    - 클라이언트가 연결된 인스턴스 이름 관리


    - 모든 인스턴스가 공유


    - Redis Strings 사용


    - (User / Driver ID, Instance Host Name)

    View Slide

  29. - 클라이언트의 소켓 세션 객체 관리


    - 각 인스턴스 내부에서만 사용
    로컬맵

    View Slide

  30. - 클라이언트의 소켓 세션 객체 관리


    - 각 인스턴스 내부에서만 사용


    - Java ConcurrentHashMap 사용


    - (User / Driver ID, Socket Object)
    로컬맵

    View Slide

  31. 연결 수립 연결 해제
    메시지 전송
    라이프사이클
    인스턴스


    시작
    인스턴스


    종료

    View Slide

  32. 인스턴스 시작
    3FEJT


    1VC4VC
    *OTUBODF
    *OTUBODF
    *OTUBODF.
    .


    .


    .

    View Slide

  33. 인스턴스 시작
    3FEJT


    1VC4VC
    *OTUBODF
    *OTUBODF
    *OTUBODF.
    .


    .


    .
    Subscribe Channel:


    Instance 1
    Subscribe Channel:


    Instance 2
    Subscribe Channel:


    Instance M

    View Slide

  34. 연결 수립
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    Local Map
    $MJFOU/

    View Slide

  35. 연결 수립
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    Local Map
    $MJFOU/
    3
    -
    Way


    Handshake

    View Slide

  36. 연결 수립
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    Local Map
    $MJFOU/
    3
    -
    Way


    Handshake
    Set


    (Client N, Socket Object)

    View Slide

  37. 연결 수립
    3FEJT


    (MPCBM.BQ
    *OTUBODF. Set


    (Client N, Instance M)
    Local Map
    $MJFOU/
    3
    -
    Way


    Handshake
    Set


    (Client N, Socket Object)

    View Slide

  38. 메시지 전송
    3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


    $MJFOU

    View Slide

  39. 3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


    $MJFOU
    (Driver 1, Payload)
    메시지 전송

    View Slide

  40. 3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


    $MJFOU
    (Driver 1, Payload)
    Key ‘Driver 1’
    메시지 전송

    View Slide

  41. 3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


    $MJFOU
    (Driver 1, Payload)
    Key ‘Driver 1’
    Value ‘Instance 2’
    메시지 전송

    View Slide

  42. 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’
    메시지 전송

    View Slide

  43. 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)
    메시지 전송

    View Slide

  44. 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
    메시지 전송

    View Slide

  45. 연결 해제
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    Local Map
    $MJFOU/

    View Slide

  46. 연결 해제
    3FEJT


    (MPCBM.BQ
    *OTUBODF. Delete


    (Client N, Instance M)
    Local Map
    $MJFOU/
    Delete


    (Client N, Socket Object)

    View Slide

  47. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT

    View Slide

  48. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT
    Exclude from routing targets

    View Slide

  49. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT
    Disconnect
    Delete


    (Client ID, Instance M)


    for all clients
    Exclude from routing targets

    View Slide

  50. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT
    Disconnect
    Delete


    (Client ID, Instance M)


    for all clients
    Terminate
    Exclude from routing targets

    View Slide

  51. O2O 서비스 특성 상 네트워크 연결이 불안정


    1. Client
    ->
    Server 전송 실패




    2. Server
    ->
    Client 전송 실패
    Fallback

    View Slide

  52. O2O 서비스 특성 상 네트워크 연결이 불안정


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패
    Fallback

    View Slide

  53. O2O 서비스 특성 상 네트워크 연결이 불안정


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패


    - 글로벌맵 조회 실패


    - 로컬맵 조회 실패


    - 소켓 메시지 전송 실패
    Fallback
    글로벌맵 조회
    로컬맵 조회
    소켓 메시지 전송

    View Slide

  54. O2O 서비스 특성 상 네트워크 연결이 불안정


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패


    - 글로벌맵 조회 실패


    - 로컬맵 조회 실패


    - 소켓 메시지 전송 실패


    ->
    GCM / APNS 푸시 메시지 전송


    Fallback
    글로벌맵 조회
    로컬맵 조회
    소켓 메시지 전송
    GCM / APNS


    푸시 메세지 전송
    실패
    실패
    실패

    View Slide

  55. 소켓 연결이 끊겼는데 글로벌맵, 로컬맵에서 제거되지 않은 경우


    1. 글로벌맵


    2. 로컬맵
    글로벌맵, 로컬맵 TTL(Time to live)

    View Slide

  56. 소켓 연결이 끊겼는데 글로벌맵, 로컬맵에서 제거되지 않은 경우


    1. 글로벌맵


    - 레디스 키-값 만료시간을 180초로 설정


    - 클라이언트-서버 메시지 전송이 있을 시 만료시간 갱신


    2. 로컬맵
    글로벌맵, 로컬맵 TTL(Time to live)

    View Slide

  57. 소켓 연결이 끊겼는데 글로벌맵, 로컬맵에서 제거되지 않은 경우


    1. 글로벌맵


    - 레디스 키-값 만료시간을 180초로 설정


    - 클라이언트-서버 메시지 전송이 있을 시 만료시간 갱신


    2. 로컬맵


    - 매 분마다 한 번씩 180초 이상 지난 키-값 제거 및 강제 연결 해제


    - 소켓 객체에 최근 클라이언트-서버 메시지 전송 시점 기록
    글로벌맵, 로컬맵 TTL(Time to live)

    View Slide

  58. 기술 스택

    View Slide

  59. 기술 스택
    Spring Boot Redis Pub/Sub

    View Slide

  60. 기술 스택
    Spring Boot Redis Pub/Sub
    Java NIO Spring WebSocket Spring MVC

    View Slide

  61. 기술 스택
    Spring Boot Redis Pub/Sub
    Java NIO Spring WebSocket Spring MVC
    Kubernetes
    D2HUB


    (사내 Docker 이미지 저장소)

    View Slide

  62. 기술 스택
    Spring Boot Redis Pub/Sub
    Java NIO Spring WebSocket Spring MVC
    Kubernetes
    D2HUB


    (사내 Docker 이미지 저장소)
    Kibana 사내 APM Sentry

    View Slide

  63. 성능 테스트

    View Slide

  64. 30k+
    소켓 연결
    성능 테스트

    View Slide

  65. 7,000
    30k+
    소켓 연결 TPS
    성능 테스트

    View Slide

  66. 7,000
    30k+
    소켓 연결 TPS
    60%
    CPU,Memory,


    Thread Pool 사용률
    성능 테스트

    View Slide

  67. 성능 테스트
    6TFS



    $POOFDUJPO


    4FSWFS
    %SJWFS



    .


    .


    .
    6TFS



    %SJWFS



    nGrinder Agents

    View Slide

  68. 6TFS



    $POOFDUJPO


    4FSWFS
    30,000


    Connections
    Message


    1
    %SJWFS



    .


    .


    .
    6TFS



    %SJWFS



    Message


    15,000
    성능 테스트
    nGrinder Agents

    View Slide

  69. 성능 테스트
    nGrinder APM

    View Slide

  70. 신규 서버


    시작
    구 서버


    종료
    DNS 스위칭
    교체 완료
    서버 교체

    View Slide

  71. 성능 및 에러율

    View Slide

  72. 1ms >
    요청 처리 시간
    성능 및 에러율

    View Slide

  73. 6.09%
    1ms >
    요청 처리 시간 Fallback 비율
    성능 및 에러율

    View Slide

  74. 6.09%
    1ms >
    요청 처리 시간 Fallback 비율
    0%
    Fallback 실패율
    성능 및 에러율

    View Slide

  75. 인프라 비용
    21년 6월


    기존
    22년 6월


    신규

    View Slide

  76. 인프라 비용
    21년 6월


    기존
    22년 6월


    신규
    -65%

    View Slide

  77. 감사합니다

    View Slide