STOMP-протокол развивался как текстовый протокол поверх WebSocket и TCP, и его версии отражают эволюцию требований к обмену сообщениями, совместимости и управлению соединением. В STOMP.js выбор версии протокола напрямую влияет на формат заголовков, правила экранирования, поддержку heartbeat-механизма и поведение подтверждений сообщений.
Первая официальная версия протокола задавала минимально необходимый набор возможностей для обмена сообщениями между клиентом и брокером.
STOMP 1.0 использует текстовый фрейм следующей структуры:
\0)Главная особенность версии — максимальная простота парсинга. Все данные передаются как UTF-8 текст без сложных правил экранирования.
В STOMP 1.0 подтверждение сообщений реализовано через заголовок
ack:
auto — автоматическое подтверждениеclient — ручное подтверждениеОднако механизм был ограничен: отсутствовала точная идентификация
сообщений через ack id, что усложняло надёжную обработку
очередей.
STOMP 1.0 имел ряд архитектурных ограничений:
hostЭти ограничения привели к появлению STOMP 1.1.
STOMP 1.1 стал важной эволюцией протокола, добавив поддержку более строгой идентификации соединений и базовую инфраструктуру для стабильных долгоживущих соединений.
Одним из ключевых изменений стало обязательное использование заголовка:
host: example.com
Это позволило одному брокеру обслуживать несколько виртуальных хостов и стало критически важным для масштабируемых систем.
STOMP 1.1 вводит heartbeat — механизм контроля живости соединения.
Он задаётся в заголовке heart-beat при CONNECT:
heart-beat: cx,cy
где:
cx — интервал отправки данных клиентомcy — интервал ожидания данных от сервераПринцип работы:
STOMP.js использует heartbeat для автоматического контроля соединения поверх WebSocket.
В STOMP 1.1 появляется ack id, позволяющий точно
идентифицировать сообщение:
ack: client
message-id: 123
Появляется возможность:
STOMP 1.1 допускает более строгую интерпретацию заголовков:
STOMP 1.2 является наиболее стабильной и широко используемой версией протокола. Она устраняет неоднозначности предыдущих версий и вводит строгие правила совместимости.
Формат фрейма сохраняется, но строго регламентируется завершение:
COMMAND
header:value
body\0
Особое внимание уделяется тому, что NULL-символ является единственным корректным завершением кадра.
В STOMP 1.2 вводится строгая система экранирования заголовков:
\r → \\r\n → \\n: → \\c\ → \\\Это устраняет неоднозначности при передаче бинарных или сложных текстовых данных в заголовках.
В 1.2 heartbeat становится более предсказуемым:
В STOMP 1.2 расширяются правила рукопожатия:
CONNECT теперь может включать:
accept-version: 1.2hostheart-beatОтвет CONNECTED содержит:
Это позволяет STOMP.js автоматически выбирать совместимый режим работы.
Появляется поддержка NACK:
Также усиливается модель транзакций:
BEGINCOMMITABORTSTOMP.js реализует поддержку всех трёх версий, но фактическая работа зависит от брокера:
При инициализации клиента STOMP.js версия указывается явно:
Stomp.client(url, {
protocols: ['v10.stomp', 'v11.stomp', 'v12.stomp']
});
или через negotiate:
client.connectHeaders = {
'accept-version': '1.2'
};
Переход между версиями протокола требует учёта различий в обработке данных.
Критические изменения:
hostmessage-idОсновные изменения:
STOMP.js обычно:
Это обеспечивает совместимость с различными брокерами без ручной настройки.
Клиент формирует список поддерживаемых версий:
1.01.11.2Брокер выбирает максимально совместимую.
STOMP.js использует внутренние таймеры:
Различия версий влияют на:
Особенно критично в 1.2, где ошибки экранирования могут приводить к некорректному разбору всего фрейма.
В STOMP.js подтверждение сообщений реализуется через:
message.ack()message.nack()Поведение зависит от версии протокола и брокера, но библиотека абстрагирует различия, сохраняя единый API.
Выбор версии протокола влияет на:
STOMP 1.2 становится предпочтительным в системах с высокой нагрузкой и требованиями к надёжности доставки, тогда как 1.0 встречается только в устаревших интеграциях.