STOMP — это текстовый протокол обмена сообщениями поверх TCP или WebSocket, предназначенный для взаимодействия клиентов с брокерами сообщений. Название расшифровывается как Simple Text Oriented Messaging Protocol.
Библиотека STOMP.js реализует клиентскую часть протокола STOMP для JavaScript и позволяет приложениям обмениваться сообщениями через брокеры:
Основная задача библиотеки — организация обмена сообщениями между клиентом и сервером в реальном времени.
Типичные сценарии:
WebSocket предоставляет постоянное двустороннее соединение между клиентом и сервером, однако сам по себе не определяет:
При использовании чистого WebSocket разработчику приходится самостоятельно реализовывать:
socket.send(JSON.stringify({
type: "message",
room: "general",
payload: {
text: "Hello"
}
}));
STOMP решает эту проблему, вводя стандартизированный протокол поверх WebSocket.
Вместо произвольных JSON-структур используется единый формат кадров (frames), поддерживаемый брокерами сообщений.
Схема взаимодействия выглядит следующим образом:
Browser
│
STOMP.js
│
WebSocket
│
Message Broker
│
Queues / Topics
Клиент:
Все команды передаются как текст.
Пример STOMP-кадра:
SEND
destination:/topic/chat
Hello world^@
^@ обозначает нулевой символ завершения кадра.
STOMP легко анализировать вручную.
Например:
SUBSCRIBE
id:sub-1
destination:/topic/news
Протокол значительно проще бинарных решений.
STOMP поддерживается:
Это делает его удобным для микросервисной архитектуры.
Брокер сообщений — промежуточный сервер, принимающий и распределяющий сообщения между клиентами.
Пример:
Client A → Broker → Client B
Клиенты не взаимодействуют напрямую.
Брокер отвечает за:
Очередь предназначена для доставки сообщения одному получателю.
Producer → Queue → Consumer
Если подписчиков несколько — сообщение обычно получает только один.
Используется для:
Topic предназначен для публикации сообщения всем подписчикам.
Publisher → Topic → All Subscribers
Используется для:
STOMP активно использует модель Pub/Sub.
Компоненты:
| Роль | Назначение |
|---|---|
| Publisher | Отправляет сообщения |
| Broker | Распределяет сообщения |
| Subscriber | Получает сообщения |
Пример:
/topic/news
Подписчики получают все сообщения данного канала.
Современная версия библиотеки устанавливается через npm.
npm install @stomp/stompjs
Импорт:
import { Client } from '@stomp/stompjs';
Базовая конфигурация:
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:15674/ws'
});
brokerURL — адрес WebSocket-брокера.
Активация клиента:
client.activate();
После этого STOMP.js:
client.onConn ect = () => {
console.log('Connected');
};
Событие вызывается после успешного STOMP-подключения.
Простейшая отправка:
client.publish({
destination: '/topic/chat',
body: 'Hello world'
});
client.subscribe('/topic/chat', (message) => {
console.log(message.body);
});
message.body содержит тело сообщения.
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:15674/ws'
});
client.onConn ect = () => {
client.subscribe('/topic/chat', (message) => {
console.log('Received:', message.body);
});
client.publish({
destination: '/topic/chat',
body: 'Hello from client'
});
};
client.activate();
После подключения STOMP.js отправляет:
CONNECT
accept-version:1.2
host:localhost
Брокер отвечает:
CONNECTED
version:1.2
После этого начинается обмен сообщениями.
Основная единица протокола — frame.
Структура:
COMMAND
header:value
Body^@
Компоненты:
| Часть | Назначение |
|---|---|
| COMMAND | Тип операции |
| headers | Метаданные |
| body | Содержимое |
| null byte | Завершение |
Подключение клиента.
CONNECT
accept-version:1.2
host:localhost
Подтверждение подключения.
CONNECTED
version:1.2
Отправка сообщения.
SEND
destination:/topic/chat
Hello
Подписка.
SUBSCRIBE
id:sub-0
destination:/topic/chat
Сообщение от брокера.
MESSAGE
destination:/topic/chat
Hello client
Отключение.
DISCONNECT
STOMP чаще всего работает поверх WebSocket.
STOMP.js автоматически использует:
WebSocket → STOMP → Broker
WebSocket обеспечивает транспорт.
STOMP обеспечивает:
Ранее STOMP.js часто использовался вместе с SockJS.
SockJS обеспечивал fallback-механизмы:
Пример:
import SockJS from 'sockjs-client';
import { Client } from '@stomp/stompjs';
const client = new Client({
webSocketFactory: () => new SockJS('/ws')
});
Сегодня в большинстве случаев достаточно обычного WebSocket.
STOMP.js поддерживает reconnect.
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
reconnectDelay: 5000
});
При потере соединения библиотека попытается подключиться повторно.
Heartbeat используется для проверки активности соединения.
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000
});
STOMP поддерживает ACK/NACK.
client.subscribe('/queue/tasks', callback);
Подтверждение автоматически.
client.subscribe('/queue/tasks', callback, {
ack: 'client'
});
Ручное подтверждение:
message.ack();
Хотя STOMP текстовый, тело сообщения может содержать:
JSON наиболее распространён.
client.publish({
destination: '/topic/chat',
body: JSON.stringify({
user: 'Alex',
text: 'Hello'
})
});
client.subscribe('/topic/chat', (message) => {
const data = JSON.parse(message.body);
console.log(data.user);
});
STOMP поддерживает заголовки.
client.publish({
destination: '/topic/chat',
headers: {
priority: '9'
},
body: 'Important message'
});
STOMP.js позволяет отслеживать весь протокол.
client.debug = (str) => {
console.log(str);
};
Можно увидеть:
client.onStompEr ror = (frame) => {
console.error(frame.headers['message']);
};
client.deactivate();
Библиотека:
Отправка:
function sendMessage(text) {
client.publish({
destination: '/topic/chat',
body: JSON.stringify({
text
})
});
}
Получение:
client.subscribe('/topic/chat', (message) => {
const data = JSON.parse(message.body);
addMessageToUI(data.text);
});
API значительно проще низкоуровневого WebSocket.
Протокол поддерживается множеством брокеров.
Не требуется самостоятельно реализовывать маршрутизацию сообщений.
Автоматическое восстановление соединения встроено в библиотеку.
Pub/Sub реализован на уровне протокола.
STOMP добавляет overhead поверх WebSocket.
Бинарные протоколы иногда быстрее.
Требуется отдельный message broker.
/topic/chat
Live-котировки и обновления.
Передача игровых событий.
Системы логирования и метрик.
Realtime-синхронизация документов.
STOMP поддерживает версии:
Современные брокеры обычно используют 1.2.
| STOMP | MQTT |
|---|---|
| Текстовый | Бинарный |
| Простая структура | Более компактный |
| WebSocket-friendly | IoT-ориентирован |
| Прост в отладке | Эффективнее по трафику |
| STOMP | AMQP |
|---|---|
| Простой | Сложный |
| Текстовый | Бинарный |
| Лёгкий клиент | Богатые возможности |
| Минимум логики | Продвинутая маршрутизация |
Последовательность работы:
activate()
↓
WebSocket open
↓
CONNECT
↓
CONNECTED
↓
SUBSCRIBE
↓
MESSAGE
↓
DISCONNECT
Библиотека особенно эффективна для:
STOMP может быть не лучшим выбором при: