Heartbeat в протоколе STOMP используется для контроля живости соединения между клиентом и брокером сообщений. В STOMP.js этот механизм реализуется на уровне периодической отправки управляющих кадров, позволяющих обнаруживать «зависшие» соединения, разрывы сети и неотвечающие серверы.
Heartbeat представляет собой два независимых интервала:
Оба значения задаются в миллисекундах и передаются в момент установления соединения.
После установления соединения клиент и сервер обмениваются параметрами heartbeat в рамках команды CONNECT и ответа CONNECTED.
Формат согласования выглядит следующим образом:
heart-beat: cx,cy
где:
Если одна из сторон не поддерживает heartbeat, значение может быть
0.
STOMP.js автоматически управляет heartbeat после подключения, если параметры заданы при инициализации клиента.
Основные особенности:
В STOMP.js heartbeat задаётся через параметры клиента:
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000,
});
heartbeatOutgoing
heartbeatIncoming
При активных настройках:
heartbeatOutgoing: 10000,
heartbeatIncoming: 10000
STOMP.js выполняет следующие действия:
\n)Heartbeat в STOMP не является отдельным сообщением протокола WebSocket. Вместо этого используются:
\n)Пример отправки heartbeat:
\n
Это минимальный допустимый payload, который поддерживается большинством STOMP-брокеров.
При подключении клиент отправляет:
CONNECT
accept-version:1.2
heart-beat:10000,10000
Сервер отвечает:
CONNECTED
heart-beat:10000,10000
Фактические значения могут отличаться в зависимости от конфигурации брокера. Например, сервер может изменить интервалы на более агрессивные или отключить входящий heartbeat.
Если входящие данные отсутствуют дольше, чем указано в heartbeatIncoming, STOMP.js инициирует разрыв соединения:
CLOSEDonWebSocketCloseПример логики реакции:
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
heartbeatIncoming: 5000,
heartbeatOutgoing: 5000,
onDisconnect: () => {
console.log('Соединение потеряно');
},
});
Heartbeat напрямую влияет на:
Слишком маленькие значения приводят к:
Слишком большие значения приводят к:
Практические диапазоны:
Часто используется симметричная настройка:
heartbeatIncoming: 15000,
heartbeatOutgoing: 15000
Heartbeat можно полностью отключить:
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
heartbeatIncoming: 0,
heartbeatOutgoing: 0,
});
В этом случае:
Heartbeat часто используется вместе с логикой автоматического reconnect:
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
reconnectDelay: 5000,
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000,
});
Поведение:
Внутри STOMP.js heartbeat реализован через таймеры:
setIntervalКаждый входящий STOMP-фрейм обновляет таймер активности соединения. Даже SUBSCRIBE или MESSAGE считаются активностью и сбрасывают таймер.
Поведение heartbeat зависит от брокера:
Несогласованные интервалы клиента и сервера Приводит к немедленным разрывам соединения.
Установка heartbeatIncoming без heartbeatOutgoing Может вызвать некорректную детекцию разрыва.
Слишком агрессивные значения (например, 1000 мс) Перегружают сеть и брокер.
Ожидание heartbeat при отключённой серверной поддержке Соединение будет считаться «мертвым» ошибочно.
Для анализа поведения используются:
debug callback)Пример включения отладки:
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
debug: (msg) => console.log(msg),
});
При кратковременных сбоях heartbeat:
При длительных обрывах:
Heartbeat создаёт минимальную нагрузку:
Однако при большом количестве соединений:
Поэтому в высоконагруженных системах heartbeat настраивается с учётом масштаба соединений.