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

    View full-size slide

  2. 커넥션 서버?


    새롭게 개발하게 된 배경


    설계 및 동작 방식


    도입 결과

    View full-size slide

  3. 카카오 T 대리

    View full-size slide

  4. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View full-size slide

  5. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View full-size slide

  6. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket

    View full-size slide

  7. 커넥션 서버?
    *OUFSOBM


    4FSWFS
    6TFS


    $MJFOU
    $POOFDUJPO


    4FSWFS
    %SJWFS


    $MJFOU
    Socket
    Socket
    PUSH
    PUSH
    PUSH

    View full-size slide

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

    View full-size slide

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


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

    View full-size slide

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


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


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

    View full-size slide

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


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


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


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

    View full-size slide

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


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


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


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


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

    View full-size slide

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

    View full-size slide

  14. 요구사항

    View full-size slide

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

    View full-size slide

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


    - 최대 30K+ 동시 연결


    - 7,000 TPS
    요구사항

    View full-size slide

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


    - 최대 30K+ 동시 연결


    - 7,000 TPS


    - 인프라 독립적


    - 스케일 아웃
    요구사항

    View full-size slide

  18. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    Socket
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    Socket
    *OUFSOBM


    4FSWFS
    HTTP

    View full-size slide

  19. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  20. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  21. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  22. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  23. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  24. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

  25. 기본 구조
    3FEJT


    1VC4VC
    6TFS


    $MJFOU
    *OTUBODF
    *OTUBODF
    *OTUBODF/
    .


    .


    .
    $POOFDUJPO
    %SJWFS


    $MJFOU
    *OUFSOBM


    4FSWFS
    Socket
    Socket
    HTTP

    View full-size slide

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

    View full-size slide

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


    - 모든 인스턴스가 공유

    View full-size slide

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


    - 모든 인스턴스가 공유


    - Redis Strings 사용


    - (User / Driver ID, Instance Host Name)

    View full-size slide

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


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

    View full-size slide

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


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


    - Java ConcurrentHashMap 사용


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

    View full-size slide

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


    시작
    인스턴스


    종료

    View full-size slide

  32. 인스턴스 시작
    3FEJT


    1VC4VC
    *OTUBODF
    *OTUBODF
    *OTUBODF.
    .


    .


    .

    View full-size slide

  33. 인스턴스 시작
    3FEJT


    1VC4VC
    *OTUBODF
    *OTUBODF
    *OTUBODF.
    .


    .


    .
    Subscribe Channel:


    Instance 1
    Subscribe Channel:


    Instance 2
    Subscribe Channel:


    Instance M

    View full-size slide

  34. 연결 수립
    3FEJT


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

    View full-size slide

  35. 연결 수립
    3FEJT


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


    Handshake

    View full-size slide

  36. 연결 수립
    3FEJT


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


    Handshake
    Set


    (Client N, Socket Object)

    View full-size slide

  37. 연결 수립
    3FEJT


    (MPCBM.BQ
    *OTUBODF. Set


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


    Handshake
    Set


    (Client N, Socket Object)

    View full-size slide

  38. 메시지 전송
    3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


    $MJFOU

    View full-size slide

  39. 3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


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

    View full-size slide

  40. 3FEJT


    (MPCBM.BQ
    *OTUBODF
    Local Map
    6TFS


    $MJFOU
    *OTUBODF
    3FEJT


    1VC4VC
    %SJWFS


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

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

  45. 연결 해제
    3FEJT


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

    View full-size slide

  46. 연결 해제
    3FEJT


    (MPCBM.BQ
    *OTUBODF. Delete


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


    (Client N, Socket Object)

    View full-size slide

  47. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT

    View full-size slide

  48. 인스턴스 종료
    3FEJT


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

    View full-size slide

  49. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT
    Disconnect
    Delete


    (Client ID, Instance M)


    for all clients
    Exclude from routing targets

    View full-size slide

  50. 인스턴스 종료
    3FEJT


    (MPCBM.BQ
    *OTUBODF.
    $MJFOUT
    Disconnect
    Delete


    (Client ID, Instance M)


    for all clients
    Terminate
    Exclude from routing targets

    View full-size slide

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


    1. Client
    ->
    Server 전송 실패




    2. Server
    ->
    Client 전송 실패
    Fallback

    View full-size slide

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


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패
    Fallback

    View full-size slide

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


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패


    - 글로벌맵 조회 실패


    - 로컬맵 조회 실패


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

    View full-size slide

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


    1. Client
    ->
    Server 전송 실패


    ->
    소켓 재연결 시도


    2. Server
    ->
    Client 전송 실패


    - 글로벌맵 조회 실패


    - 로컬맵 조회 실패


    - 소켓 메시지 전송 실패


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


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


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

    View full-size slide

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


    1. 글로벌맵


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

    View full-size slide

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


    1. 글로벌맵


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


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


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

    View full-size slide

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


    1. 글로벌맵


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


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


    2. 로컬맵


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


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

    View full-size slide

  58. 기술 스택

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    (사내 Docker 이미지 저장소)

    View full-size slide

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


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

    View full-size slide

  63. 성능 테스트

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    Thread Pool 사용률
    성능 테스트

    View full-size slide

  67. 성능 테스트
    6TFS



    $POOFDUJPO


    4FSWFS
    %SJWFS



    .


    .


    .
    6TFS



    %SJWFS



    nGrinder Agents

    View full-size slide

  68. 6TFS



    $POOFDUJPO


    4FSWFS
    30,000


    Connections
    Message


    1
    %SJWFS



    .


    .


    .
    6TFS



    %SJWFS



    Message


    15,000
    성능 테스트
    nGrinder Agents

    View full-size slide

  69. 성능 테스트
    nGrinder APM

    View full-size slide

  70. 신규 서버


    시작
    구 서버


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

    View full-size slide

  71. 성능 및 에러율

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  75. 인프라 비용
    21년 6월


    기존
    22년 6월


    신규

    View full-size slide

  76. 인프라 비용
    21년 6월


    기존
    22년 6월


    신규
    -65%

    View full-size slide

  77. 감사합니다

    View full-size slide