[Network] STOMP

impala·2023년 7월 25일
0
post-thumbnail

STOMP

STOMP is the Simple(Streaming) Text Orientated Messaging Protocol

STOMP란 TCP나 웹소켓같은 양방향 네트워크 프로토콜 위에서 동작하는 텍스트 기반 메세징 프로토콜로, 클라이언트와 서버가 통신에 사용하는 메세지의 유형, 형식, 내용등을 정의한다.

웹소켓을 사용하면 서버와 클라이언트가 실시간으로 메세지를 주고받을 수 있지만, 웹소켓은 메세지의 형식까지는 정의하고있지 않기 때문에 STOMP를 사용하여 메세지의 형식을 지정하는 방식으로 웹소켓의 단점을 보완할 수 있다.

STOMP기반 통신과정

STOMP를 사용하는 서버와 클라이언트는 메세지브로커를 통한 pub/sub방식으로 메세지를 주고받는다.

Pub/Sub모델

Pub/Sub모델이란 비동기 메세지를 교환하는 메세징 패러다임의 일종으로, Publisher가 특정 주소에 메세지를 발행하면 해당 주소를 구독하고 있는 Subscriber가 이 메세지를 수신하는 방식이다.

Message Broker

Message Broker는 Pub/Sub모델에서 Publisher가 발행한 메세지를 Subscriber에게 전달해주는 주체로서, 상용 제품으로는 RabbitMQ, Kafka, Amazon SQS등이 있다.

통신 과정

Subscriber들은 특정 topic을 구독하고, Publisher가 해당 topic으로 메세지를 발행하면 메세지 브로커를 통해 그 topic을 구독한 Subscriber들에게 메세지가 전달된다.

STOMP 프레임 구조

COMMAND
header1:value1
header2:value2

body^@

STOMP는 Command, Header, Body라는 정해진 구조를 가지고 있다.

  • Command: SEND, SUBSCRIBE, MESSAGE등 메세지의 동작을 정의한다.
  • Header: 메세지의 추가적인 정보를 제공한다.
  • Body: 메세지의 내용에 해당한다. 텍스트나 바이너리 데이터가 올 수 있다.

STOMP메세지의 각 커맨드는 다음과 같은 용도로 사용된다.

  • SUBSCRIBE: 특정 topic을 구독할 때 사용하는 커맨드로, destination 헤더를 통해 구독할 topic을 특정한다.
    • 일반적으로 브로드캐스팅이나 멀티캐스팅에는 'topic/', 유니캐스팅에는 'queue/'를 destination헤더로 사용한다.
    • id 헤더는 구독요청을 식별하기 위해 사용된다.
SUBSCRIBE
destination:/topic/room/1
id:sub-1

^@
  • SEND: Publisher가 메세지를 발행할 때 사용하는 커맨드로, destination헤더를 통해 메세지를 발행할 topic을 고를 수 있다.
SEND
destination: /topic/room/1
content-type: application/json

{"roomId":1, "content": "Hi"}
  • MESSAGE: 서버에서 메세지를 브로드캐스팅할 때 사용된다.
    • message-id 헤더는 SUBSCRIBE 메세지의 id 헤더와 일치해아 한다.
MESSAGE
subscription:0
message-id:1
destination:/topic/room/1
content-type:application/json

{"roomId":1, "content":"memberA join the room1"}

STOMP의 장점

  • 메세징 프로토콜을 만들고 메세지 형식을 커스터마이징 할 필요가 없다
  • 외부 메세지 브로커를 사용할 수 있다
  • 하나의 웹소켓 연결 주소 안에서 메세지의 목적지를 구분할 수 있다

참고 자료

2개의 댓글

comment-user-thumbnail
2023년 7월 25일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

답글 달기
comment-user-thumbnail
2023년 8월 23일

나는 이 프로토콜의 우아함과 효율성을 높이 평가합니다. fnf STOMP의 텍스트 기반 접근 방식은 다양한 네트워크 프로토콜을 통한 메시징을 단순화합니다.

답글 달기