CLUE WebSocket 구현 - linewalks/dev-common GitHub Wiki

공통 패킷 정의

C2S.LOGIN

  • 로그인 요청
  • Parameter
    • jwt: jwt 토큰
      • access token 만료 시간을 봐야하나..?
      • refresh token을 보내도 될 듯?

S2C.LOGIN

  • 로그인 응답
  • 유효하지 않은 jwt면 연결 끊기

공통 라이브러리 구현

FE

  • Socket 필요 페이지 Wrapper
    • withSocket(SomePage, socketURL)
    • 소켓에 자동 연결 후, 로그인 요청
  • Handling Connection
    • 연결 끊길시 자동으로 재연결 요청
  • Socket Event Handler
    • 각 페이지에서 필요한 응답해야할 메세지 핸들러 정의할 수 있게
    • socket.addEventHandler(‘S2C.COMPARISON_ADD_COHORT’, handleAddCohort)

BE


@socket.handler("C2S.COMPARISON_ADD_COHORT")
def comparison_add_cohort(data):
  # do something
  dasima.exchanger.send_message(
    {
      name: "S2C.COMPARISON_ADD_COHORT",
      data: {}
    },
    "broadcast_to_room"
  )

@dasima.exchanger.subscribe("broadcast_to_room")
def comparison_broadcast_to_room(name, data):
  # 누구한테 보낼지 확인해서 정하기
  socket.emit(name, data)
  
  • Socket과 사용자 매칭
    • 메세지가 어느 소켓에서 왔는지에 따라 보낸 사용자 특정 가능하게
    • 매번 jwt 체크할 필요 없음
  • MQ와 소통
    • gunicorn, auto scaling 등으로 서버가 여러개 뜨는 경우, 대응하기 위하여
    • 순서
      • Client 요청
        • 코호트 추가해주세요!
      • 요청 처리
        • DB에 코호트 추가 후, 필요한 변수값 추출
      • 응답 등록
        • DB에 코호트가 추가되었으니 클라이언트에 응답을 해주어야함
        • 코호트가 추가되었다는 것은 해당 comparison을 보고 있는 모두에게 알려줘야함
        • 다른 API 서버에 연결되어 있는 Client는 알 수 없음
        • MQ에 어떤 comparison에 어떤 cohort가 추가되었는지 등록(Publish)
      • 응답 Fetch
        • 모든 API 서버가 MQ에 등록된 메세지를 가져옴
      • 응답 전달
        • 해당 응답을 보고 각자가 알고 있는 해당 comparison을 보고 있는 client들에게 응답을 전달함

image