ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] WebSocket
    자바/기타 2021. 3. 22. 10:03

    WebSocket

    • 웹 브라우저(클라이언트)와 서버간의 full-duplex(양방향), bi-directional(전이중적인), persistent conntection(지속적인 연결)의 특징을 갖는 프로토콜
    • 웹 브라우저 환경에서 TCP 통신처럼 연결 지향 프로토콜이 필요하게 됨에 따라 탄생
    • WebSocket vs TCP
      • WebSocket은 연결 요청에 대해 http를 통해 switching 및 handshaking이 이루어진다.
      • TCP는 Binary 데이터만 주고 받을 수 있지만, WebSocket은 Binary 데이터뿐만 아니라 Text 데이터를 주고 받을 수 있다.
    • Spring에서 WebSocket 구현 방법
      • WebSocket 데이터를 직접 처리
        • 웹 소켓 핸들러를 직접 상속받아 low level 수준에서 데이터를 직접 처리
      • Stomp 프로토콜을 사용하여 메세지 처리
        • Message Queue를 사용해서 메세지를 전달

    STOMP (The Simple(or Streaming) Text Orientated Messaging Protocol)

    • 많은 언어와 플랫폼, 브로커 사이에서 쉽고 광범위한 메세지 상호 운용성을 제공
    • STOMP 클라이언트들이 어떤 STOMP 메세지 브로커와도 통신 할 수 있도록 상호 정보 교환이 가능한 유선 형식을 제공
    • 구성 요소
      • Receive Client
        • 메세지를 받기 위해 특정 토픽을 사전에 서버에서 Subscribe 해야 한다.
      • Send Client
        • 서버와 연결된 클라이언트는 특정 Path로 메세지를 Send한다.
      • Broker
        • Kafka, RabbitMQ, ActiveMq 등의 오픈소스들 처럼 AMQP(Advanced Message Queuing Protocol)를 구현한 메시지 브로커 시스템을 사용하며 pub/sub 모델을 따른다.
        • 토픽에 따라 메세지를 전달해야 하는 사용자를 구분한다.
        • 연결된 클라이언트의 세션을 관리한다.
        • 특정 토픽과 메세지를 매핑하여 토픽을 구독하는 세션에 존재하는 클라이언트에 메세지를 전달한다.

    RabbitMQ Exchange Type

    Direct Exchange

    메시지에 포함된 routing key를 기반으로 Queue에 메시지를 전달

    • Exchange X로 전달된 메시지의 routing key가 orange인 경우 Q1으로 전달되고, black/green인 경우 Q2로 전달된다. 그 밖에 다른 메시지는 무시된다.
    • Default Exchange는 이름이 없는 Direct Exchange의 한 형태이고, Default Exchange는 전달될 목적지 Queue 이름과 동일한 routing key를 부여한다.

    Fanout Exchange

    routing key 관계없이 연결된 모든 Queue에 동일한 메시지를 전달한다.

    Topic Exchange

    • routing key 전체가 일치하거나 일부 패턴과 일치하는 모든 Queue로 메시지가 전달된다.
    • 여러 Consumer에서 메시지 형태에 따라 선택적으로 수신해야하는 경우와 같이 다양한 pub/sub 패턴 구현에 활용될 수 있다.
    • Topic Exchange에서 사용하는 binding key는 점(.)으로 구분된 단어를 조합해서 정의한다.
    • binding key를 와일드 카드로 표현 가능하다.
      • * : 단어 하나 일치
      • # : 0 또는 1개 이상의 단어 일치

    Headers Exchange

    • 메시지 헤더를 통해 binding key만을 사용하는 것보다 더 다양한 속성을 사용할 수 있다.
    • Header exchange를 사용하면 binding key는 무시되고, 헤더 값이 바인딩 시 지정된 값과 같은 경우에만 일치하는 것으로 간주한다.

     

     

    참고 자료
    swiftymind.tistory.com/tag/Websocket%20%2B%20STOMP
    jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/

     

     

    '자바 > 기타' 카테고리의 다른 글

    [JAVA] OAuth2  (0) 2021.03.24
    [Java] JPA (Java Persistence API)  (0) 2021.03.23
    [UML] 유스케이스 다이어그램  (0) 2021.02.02
    [JAVA] 멀티 모듈 프로젝트 구성  (0) 2020.09.21
    [IntelliJ] 단축키 정리  (0) 2020.09.11

    댓글

Designed by Tistory.