네트워크

STOMP

계양 꿀주먹 2024. 8. 19. 21:41

STOMP, Simple Text Oriented Messaging Protocol

WebSocket은 Text, Binary 두 가지 타입의 메시지만 주고 받을 수 있고 메시지의 내용에 대해서는 형식이 정해져있지 않습니다.

이 때문에 메시지 전송을 효율적으로 하기 위해 탄생한 프로토콜이 STOMP 입니다.

STOMP는 frame 기반의 프로토콜이며 command - header - body 구조로 되어있습니다.

또한 STOMP는 publish - subscribe 의 형태로 메시지를 전송 / 구독하여 처리합니다.


STOMP frame 구조

COMMAND

header1:value1

header2:value2

Body^@

 

- Command

클라이언트 command는 CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, COMMIT, ABORT, ACK, NACK, DISCONNECT 등이 있습니다.
서버 command에는 CONNECTED, MESSAGE, RECEIPT, ERROR 등이 있습니다.

 

- CONNECT : 클라이언트 연결 시작합니다.

CONNECT
accept-version:1.0,1.1,2.0
host:stomp.github.org

^@

 

- CONNECTED : 서버가 연결 시도를 수락하면 CONNECTED로 응답합니다.

CONNECTED
version:1.2

^@

 

- ERROR : 서버가 연결을 거부한 경우 ERROR 프레임에 거부 이유 담아서 응답을 권장합니다.

ERROR
version:1.2,2.1
content-type:text/plain

Supported protocol versions are 1.2 2.1^@

 

- SEND : 메시지 전송합니다.

SEND
destination:/queue/a
content-type:text/plain

hello queue a
^@

* destination : 메세지의 목적지

* content-type : body type

 

- SUBSCRIBE : 메시지를 구독할 수 있습니다.

SUBSCRIBE
id:0
destination:/queue/foo
ack:client

^@

* destination : 구독할 대상 지정

* ack : 메시지 소비 방식 정의 auto / client

  - auto

    기본값이며 클라이언트가 메시지를 수신할 때마다 자동으로 서버에 ack을 보냅니다. 

    이 경우 클라이언트의 별도의 확인 절차 없이 수신하는 즉시 해당 메시지가 처리된 것으로 서버에 전달합니다.

  - client, client-individual

    클라이언트가 명시적으로 ack 프레임을 전송해야만 서버에서 메시지가 확인된 것으로 간주합니다.

    * client : 여러 메시지를 묶어서 ack 전송 가능

    * client-individual : 각 메시지마다 ack 전송


Publish - Subscribe

pub / sub 방식은 특정 주제(Topic)에 대해 메시지를 발행(publish)하고, 그 주제에 대해 구독(subscribe)한 클라이언트들이 그 메시지를 수신하는 구조입니다.

  • 발행(Publish):
    • 발행자는 특정 주제(토픽)에 대해 메시지를 전송합니다.
  • 구독(Subscribe):
    • 구독자는 특정 주제를 구독하여, 그 주제에 대해 발행된 메시지를 수신합니다.
    • 여러 구독자가 동일한 주제를 구독할 수 있으며, 그 경우 동일한 메시지를 모두 수신합니다.
  • 토픽(Topic):
    • 발행자와 구독자 간의 연결점입니다. 메시지가 발행되고 구독되는 특정 주제입니다.
    • 예를 들어, 채팅방을 하나의 토픽으로 간주할 수 있습니다.

참고

https://stomp.github.io/stomp-specification-1.2.html