Автоматическое квитирование (auto ack) в STOMP.js определяет режим, при котором сообщение считается успешно обработанным сразу после его доставки клиенту, без явного подтверждения со стороны приложения. Такой подход исключает необходимость вызова методов подтверждения и полностью перекладывает ответственность за фиксацию доставки на клиентскую библиотеку и брокер сообщений.
В протоколе STOMP квитирование является механизмом управления
надёжностью доставки сообщений. Оно определяет момент, когда брокер
может удалить сообщение из очереди или считать его успешно обработанным.
В STOMP.js этот механизм реализуется через параметр ack при
подписке на destination.
Автоматический режим квитирования задаётся значением
ack: 'auto' при подписке. В этом случае каждое доставленное
сообщение считается подтверждённым немедленно после передачи его в
обработчик подписки.
client.subscribe('/queue/orders', (message) => {
console.log(message.body);
}, { ack: 'auto' });
Внутренне STOMP.js не ожидает вызова message.ack() и не
сохраняет состояние неподтверждённых сообщений для данной подписки. Как
только кадр MESSAGE доставлен в callback, брокер получает неявное
подтверждение на уровне протокола.
При использовании автоматического квитирования брокер работает в модели доставки «at most once». Это означает, что сообщение:
Фактически подтверждение фиксируется в момент передачи сообщения по WebSocket-соединению, а не после выполнения логики обработчика.
Для понимания автоматического режима важно сопоставить его с альтернативными стратегиями.
client.subscribe('/queue/orders', (message) => {
process(message.body);
message.ack();
}, { ack: 'client' });
В этом режиме подтверждение отправляется только после явного вызова
ack(). Сообщение остаётся неподтверждённым до завершения
обработки.
client.subscribe('/queue/orders', (message) => {
process(message.body);
message.ack();
}, { ack: 'client-individual' });
Каждое сообщение подтверждается отдельно, даже если брокер поддерживает групповые подтверждения.
STOMP.js реализует автоматическое квитирование на уровне клиента, а не брокера. Это означает, что:
ack в SUBSCRIBE кадре
устанавливается в значение auto;ack() или nack();Пример SUBSCRIBE кадра:
SUBSCRIBE
id:sub-0
destination:/queue/orders
ack:auto
^@
Автоматическое квитирование напрямую влияет на семантику доставки сообщений. Основная характеристика режима — отсутствие гарантии обработки после получения.
Сценарий потери сообщения возможен в следующих случаях:
В таких условиях брокер уже считает сообщение подтверждённым и не предпринимает повторной доставки.
Так как подтверждение происходит автоматически, ошибки обработки не влияют на жизненный цикл сообщения. Это создаёт необходимость вынесения критически важной логики в дополнительные механизмы:
client.subscribe('/queue/orders', async (message) => {
try {
await processOrder(JSON.parse(message.body));
} catch (e) {
logError(e, message.body);
}
}, { ack: 'auto' });
Даже при ошибке сообщение уже считается подтверждённым, поэтому повторной доставки не произойдёт.
Автоматическое квитирование минимизирует накладные расходы:
ACK;В системах с высокой пропускной способностью это может существенно улучшить throughput, особенно при большом количестве коротких сообщений.
Auto ack применяется в ситуациях, где потеря отдельного сообщения допустима или компенсируется другими механизмами:
В противоположность этому, финансовые операции, заказы и транзакционные события требуют более строгих режимов квитирования.
Автоматическое квитирование не связано с STOMP-транзакциями. Даже при использовании транзакционного контекста подтверждение доставки сообщения не откладывается.
Это означает, что:
Основные ограничения автоматического квитирования:
Эти ограничения делают режим подходящим только для потоков данных, где допустима деградация точности ради скорости обработки.
Автоматическое квитирование формирует модель «at most once», тогда как альтернативные режимы дают другие гарантии:
Выбор режима напрямую влияет на архитектуру всей системы обработки сообщений, включая устойчивость к сбоям и стратегию повторной обработки.