TIL
2022.01.22
superLipbalm
2022. 1. 23. 02:17
한 일
- Polling, Long-Polling, WebSocket 공부
- Polling, Long-Polling, WebSocket 각각을 사용해 실시간 채팅 구현
- requestAnimationFrame에 대한 토막지식
- socket.io 에서 room에 브로드캐스트 하는 기능 어떻게 구현했는지 살펴보기
배운 것
- Polling
- 주기적으로 요청해 상태 변경이 있는지 확인하는 방법
- 불필요한 트래픽이 발생할 수 있음
- 상태 변경 유무와 관계 없이 주기적으로 요청을 하기 때문
- 주기를 짧게하면 서버 부담이 커지고 길게하면 실시간성이 떨어짐
- Long-Polling
- 요청에 대한 응답을 상태 변경이 있을 때 받는 방법
- 변경이 없다면 변경이 생길때까지 응답 대기함
- 실시간성이 중요하지만 서버의 상태 변경이 적은 서비스에 적합
- Polling에 비해 불필요한 트래픽을 덜 유발함
- 변경이 있을 때만 응답하므로
- 보통 무한정 대기하지 않고 일정 시간 이후 서버측에서 타임아웃 시켜 재요청 하도록 함
- 변경이 있을 때만 응답하므로
- 변경 발생시 응답을 받고 즉시 요청을 하므로 요청이 특정 시점에 쏠림
- 1000명 있는 채팅방에 메시지 하나 날리면 응답 1000개 우르르 받고 바로 요청 1000개 우르르...
- 변경이 자주 발생하면 Polling보다 더 요청 많이 할 수도 있음
- 요청에 대한 응답을 상태 변경이 있을 때 받는 방법
- WebSocket
- HTTP를 통해 HandShake 하고 나서는 TCP 연결을 유지하고 양방향 실시간 통신 가능
- Plain Text와 Binary 데이터만 전송 가능하기 때문에 Sub-Protocol 필요
- 어떻게 데이터를 해석할 것인지
- HandShake 과정에서 어떤 Sub-Protocol 쓸 것인지(수 있는지) 주고 받음
- 연결 유지를 위한 비용이 발생
- 연결 상태를 메모리에 저장하고 있어야 함
- TCP 포트 하나를 지속 점유
- requestAnimationFrame
- 화면 변경 없어도 화면 갱신 트리거 됨
- console.log만 찍어도 Composite Layers 수행되는 것을 확인 가능
- 용도에 맞게 화면 변경 필요할때(애니메이션)만 쓰자...
- Object.fromEntries()
- key-value 쌍 리스트를 객체로 바꿔줌
충격.. setTimeout와 requestAnimationFrame에 이런 차이가 있었어!? - YouTube
socket.io-adapter/index.ts at master · socketio/socket.io-adapter (github.com)
GitHub - socketio/socket.io-adapter
Contribute to socketio/socket.io-adapter development by creating an account on GitHub.
github.com
Object.fromEntries() - JavaScript | MDN (mozilla.org)
Object.fromEntries() - JavaScript | MDN
Object.fromEntries() 메서드는 키값 쌍의 목록을 객체로 바꿉니다.
developer.mozilla.org
느낀 것
- 개념만 알고 있었는데 실제 구현하고 개발자 도구로 통신하는거 보니까 재밋다!
- 사실 개념도 애매하게 알고 있었다 ㅎ
- 그래서 면접에서 털림 ㅠ
- socket.io 쓰기 전에 미리 해봤으면 좋았을껄... ㅋㅋ
- 내일 코드랑 같이 좀 더 자세히 정리해야겠다!
- Socket.io의 ROOM 기능을 ws 모듈로 구현하려면 어떻게 해야할까?
- 각 ROOM에 들어있는 클라이언트 소켓 객체들을 갖고 있는 배열을 값으로하는 딕셔너리 만듦
- 브로드캐스팅시 해당 ROOM 배열 순회하며 메시지 전송!
- 요렇게 면접때 말했는데 이러면 클라이언트 많아지면 맨앞과 맨뒤 클라이언트 사이 시간차가 너무 커지지 않을까요? 하셨다.
- HTTP 2.0처럼 조각조각 프레임단위로 쪼개서 멀티플렉싱 하면?
- ROOM에 브로드캐스팅 하는건 모두 같은 사이즈 데이터 보내는건데 의미가 있나?
- 순서에 따른 갭은 줄겠지만 대기시간 총합은 오히려 늘어나는게 아닌가?
- 앞에서 뭔가 큰게 막고 있는 상황이라면 좋겠지만 이 경우엔 아닌거 같음...
- 으악 모르겠다!