CS

[Network] websocket & stomp, 실시간 통신

KJihun 2023. 11. 7. 16:33
728x90

 

 

 

 

 

Http와 웹소켓의 차이

  • http
    • 클라이언트가 서버에 요청을 하면 서버가 응답을 보내는 단방향 통신
    • 비연결성(요청 - 응답 시에만 연결을 유지), 무상태성(서버는 클라이언트의 상태를 보존하지 않음) 특성을 가짐
  • 웹소켓
    • 클라이언트 - 서버 간 실시간 통신이 가능하도록 하는 양방향 통신 프로토콜
    • 요청 - 응답 형태가 아니라 데이터가 변경될 때 마다 이벤트를 보내거나 받는다

 

 

소켓의 동작 방법

  • HTTP로 접속요청 후 웹소켓 프로토콜로 변경 후 실시간 통신으로 이루어진다.
 

웹소켓 개념과 원리

개념정리 웹소켓 개념과 원리 웹소켓(WebSocket)의 개념 웹소켓이란? 웹소켓(WebSocket) 기존의 단방향 HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜 일반 Socket통신과 달리

yuricoding.tistory.com

 

  1. polling
    • 클라이언트가 일정 주기로 서버에게 필요한 데이터를 요청하는 방식
    • 구현이 간단하지만 변경사항이 없어도 지속적으로 요청을 보내기 때문에 오버헤드 발생
    • 일정 주기로 요청을 보내는 방식이기에, 다른 방법들에 비해 실시간성이 떨어진다.
  2. Long polling
    1. 클라이언트는 서버로 Http Request를 보냄
    2. 서버는 전달할 이벤트가 있다면 Response 전달 후 연결 종료
    • 이벤트 발생이 빈번할 경우, 연결 및 해제에 자원낭비가 심해지므로 비효율적
  3. streaming
    • Long polling과 같은 방식이지만, response 후에도 연결을 끊지 않는다
    • 실시간성이 가장 뛰어나지만, 구현이 복잡하고 서버 리소스를 많이 사용할 수 있다.

 

 

실시간 네트워킹 하면서 양방향으로 통신이 가능한 다른 기술

  • WebRTC: P2P 방식. 모든 사용자가 서버 없이 직접 연결할 수 있어야 한다
  • MQTT: TCP/IP 기반의 메시징 프로토콜로서, 주로 IoT - 서버 간에 쓰인다
  • Comet, SSE 등은 단방향 통신
 

실시간으로 소통하고 싶다면?

트센 ㄱㅈㅇㅇㅇ

velog.io

 

 

다른 실시간 통신 기술들도 많이 존재하는데 websocket을 기술스택으로 사용한 이유

  • HTTP 기반의 프로토콜의 실시간 양방향 프로토콜이기에 채용했다.

 

 

웹소켓의 한계가 무엇이며 극복하기 위해 서브 프로토콜로 STOMP를 사용한 이유

  • 웹소켓: 단순한 구조로 인해 메세지가 어떤 요청인지, 어떻게 처리해야 하는지를 알 수 없다.
  • STOMP: websocket 위에서 동작하는 프로토콜로써, 클라이언트 - 서버 간 전송할 메세지 유형, 형식, 내용 등을 정의하는 메커니즘
    • pub/sub 방식을 사용하여 메세지 브로커를 발행자/구독자로 구분하여 발행자의 메세지를 구독자에게 전달한다.

 

 

pub/sub 구조란 무엇인가

  • 발행 - 구독의 의미로 소프트웨어 아키텍처 패턴 중 하나이다.
  • 메시지 브로커를 통해 다수의 컴포넌트나 시스템 간 메시지를 주고받을 수 있게 해준다
  • 메시지 브로커: pub(발행)으로 부터 받은 메시지를 모든 sub(구독)에게 전달한다.
  • 확장이 용이하며 낮은 결합도를 유지할수 있고, 비동기적으로 동작하므로 실시간성이나 뫂은 처리량을 오규하는 시스템에 적합하다.

 

 

메시지 큐

  • 메시지 큐(MQ; Message Queue) : 프로세스 간에 데이터를 교환할 때 사용되는 통신 방법 중 하나. MOM을 구현한 서비스를 MQ라고 함
  • MOM(Message Oriented Middleware, 메세지 지향 미들웨어) : 비동기 메세지를 사용하는 프로그램 간 데이터 송수신을 의미한다.

 

 

인메모리 기반 메시지 브로커의 문제점 ⇒ Redis

  • RAM은 비교적 메모리가 작기에 메모리 부족 문제가 발생할 수 있다.
  • 인메모리는 휘발성이기에 영구적으로 저장할 수 없다.

 

 

 

웹소켓 사용시에 보안 관련한 요소 (인증 , 인가)

  • stomp는 고유 ID값을 통해 구독 상태의 유저를 추적할 수 있다.
  • 발행자가 채팅방 생성 시, chatingRoom UUID를 구독자에게 전달하여 1:1 통신이 가능하도록 하였다.

 

 

 

redis 이외의 외부 메시지 브로커 (Kafka, rabbitMq) 대신 redis를 사용한 이유

  • redis는 인메모리 기능을 제공하기 때문에 kafka나 rabbitMQ에 비해 처리속도가 빠르다.

'CS' 카테고리의 다른 글

[Spring]Front Controller, Dispatcher Servlet  (0) 2023.11.16
[mySQL] 면접 예상 질문  (0) 2023.11.07
[JPA] N+1  (0) 2023.10.30
[JPA] ORM, JPA  (1) 2023.10.30
[JPA] Propagation  (0) 2023.10.27