CS
1. http 통신
- 데이터를 대부분 text로 주고 받음
- stateless 프로토콜: 서버가 클라이언트의 상태를 저장하지 않음 (데이터 1회 요청할 때마다 connect/close가 반복됨)
- 반드시 DB(레디스 등의 메모리)를 거쳐 데이터를 주고 받음
- 유저 데이터를 들고 있지 않음
2. socket 통신
- 소켓: 네트워크 상에서 돌아가는 2개의 프로그램으로 C-S 간의 접속 점이다
- 패킷이라는 형식화된 데이터 메모리 단위를 주고 받아 통신
- 특정 port를 열어서 실시간으로 양방향 통신을 함 (onClose; onConnection함수로 특정 소켓 인덱스 번호가 들어오는 이벤트가 발생한다)
- stateful 프로토콜: 서버가 클라이언트의 상태를 저장하고 있음 => C-S 측에서 임의로 연결 상태를 끊지 않는 한 서로 연결이 유지됨
- 웹 서버와 다르게, 브로드캐스트가 아닌 디테일한 통신이 가능하다
- 서버 자체에서 데이터를 저장하고 유지함
- 그래서 실시간 통시 및 임시 데이터 저장이 필요한 곳에 사용한다
2-1. STOMP Simple Text Oriented Messaging Protocol
- 채팅방이나 알림 기능을 만들 떄 등장하는 개념
- WebSocket: 단지 양방향 통신 통로이기 보다, 메세지의 형식을 정해주지 않는데, STOMP는 통로 위에서 동작하는 메세지 전송 규약이다.
- 역할: 발행/ 구독 모델을 사용해서 메시지 라우팅을 처리한다
- 예: “사용자 A가 /sub/chat/room/1을 구독하면, 사용자 B가 /pub/chat/room/1로 보낸 메시지를 A가 받는다.”
2-2. 동작 원리
- S: listen이라는 포트를 통해서 항상 열어둠
- C: connect()를 통해서 연결 요청을 보냄
- S: accept() 함수를 통해서 연결을 수락
- C/S: send()/recv() 함수를 통해서 패킷을 주고 받으며 데이터 처리가 발생함 - DB와 통신함
3. 웹 서비스에서 양방향 통신을 할 수 있는 프로토콜?
- WebRTC
- Socket.io
- web socket
4. Web Socket
- C-S 간의 정보를 양방향으로 통신하기 위한 프로토콜
- stateful protocol - TCP 단계에서 돌아간다고 느린 거 아님. 한번 Connection을 맺으면 일정 시간 동안 커넥션을 유지할 수 있음
- 웹서버와 통신이 가능하다
- WebSocket: C-S/ WebRTC: p2p방식
5. 메시지 브로커와 확장성 Redis Pub/Sub, Kafka
- websocket는 stateful함. 서버 간에 메시지를 중계해 줄 Redis Pub/Sub나 RabbitMQ, Kafka 같은 외부 메시지 브로커가 필요함
6. SSE Server-Sent Events
- 양방향 통신이 필요없는 경우도 많음 (ex. 주식 가격 실시간 업데이트, 스포츠 중계 점수, 알림)
- 서버에서 클라이언트로만 데이터를 보내는 단방향 통신
- WebSocket보다 가벼움 + HTTP 프로토콜을 그대로 사용함 + 재연결 처리가 더 쉬움