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에 코호트가 추가되었으니 클라이언트에 응답을 해주어야함
- 코호트가 추가되었다는 것은 해당 comparison을 보고 있는 모두에게 알려줘야함
- 다른 API 서버에 연결되어 있는 Client는 알 수 없음
- MQ에 어떤 comparison에 어떤 cohort가 추가되었는지 등록(Publish)
- 응답 Fetch
- 모든 API 서버가 MQ에 등록된 메세지를 가져옴
- 응답 전달
- 해당 응답을 보고 각자가 알고 있는 해당 comparison을 보고 있는 client들에게 응답을 전달함
