Протокол STOMP (Simple Text Oriented Messaging Protocol) определяет механизм передачи сообщений между клиентом и брокером, однако сам по себе не навязывает строгую модель приоритетов доставки. Поддержка приоритетов реализуется на уровне брокера сообщений, а не клиентской библиотеки.
В STOMP приоритет задаётся через заголовок сообщения:
priority: <число от 0 до 9>
Ключевые особенности:
0 (низший приоритет) до
9 (наивысший)Библиотека STOMP.js выполняет исключительно транспортную функцию:
STOMP.js не управляет очередями и не сортирует сообщения.
Пример отправки сообщения с приоритетом:
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:15674/ws',
reconnectDelay: 5000
});
client.onConn ect = () => {
client.publish({
destination: '/queue/orders',
body: JSON.stringify({ orderId: 123 }),
headers: {
priority: '7'
}
});
};
client.activate();
В этом примере значение priority: '7' передаётся
брокеру, который уже решает, как его интерпретировать.
Разные брокеры по-разному реализуют обработку приоритетов.
В ActiveMQ и Artemis приоритеты поддерживаются на уровне очередей:
Особенности:
В RabbitMQ поддержка приоритетов зависит от типа очереди:
x-max-prioritypriority игнорируетсяПример конфигурации очереди:
channel.assertQueue('tasks', {
arguments: {
'x-max-priority': 10
}
});
Приоритет влияет только на порядок извлечения сообщений из очереди, но не на:
Важно: Приоритет не является механизмом QoS, он не гарантирует мгновенную обработку.
STOMP определяет заголовки как строковые пары ключ-значение. Поэтому:
headers: {
priority: '9'
}
или
headers: {
priority: 9
}
оба варианта обычно допустимы, но большинство брокеров ожидает строковое значение.
Стандартная интерпретация:
0–3 — низкий приоритет4–6 — средний7–9 — высокийОднако конкретная градация не регламентирована протоколом.
При наличии приоритетов брокер может изменять порядок выдачи сообщений:
Пример логики:
Очередь:
A (priority 3)
B (priority 9)
C (priority 5)
Доставка:
B → C → A
Несмотря на наличие механизма, существуют фундаментальные ограничения:
Режим подтверждения сообщений (ACK) может влиять на наблюдаемое поведение приоритетов.
client.subscribe('/queue/tasks', message => {
// обработка
message.ack();
}, { ack: 'client-individual' });
Особенности:
При нескольких подписчиках на одну очередь:
Сценарий:
Consumer A: быстрый
Consumer B: медленный
Высокий priority:
уходит A и B
Низкий priority:
может обрабатываться только B или откладываться
Приоритеты обычно применяются в системах:
Типичная схема:
client.publish({
destination: '/queue/payments',
body: JSON.stringify(payment),
headers: {
priority: payment.isUrgent ? '9' : '4'
}
});
STOMP 1.0, 1.1 и 1.2 не вносят существенных изменений в модель приоритетов. Отличия касаются:
Приоритет остаётся пользовательским заголовком.
Priority игнорируется брокером
Нарушение порядка сообщений
Ожидание строгого приоритета
Передача некорректных значений
STOMP.js не знает о:
Он передаёт только структуру:
SEND
destination:/queue/example
priority:5
<payload>
Вся дальнейшая логика находится вне клиента.
Приоритеты в STOMP-системах являются механизмом оптимизации очередности обработки, а не гарантом строгого порядка. Их эффективность определяется конфигурацией брокера, количеством consumers и моделью нагрузки.
В системах с высокой конкуренцией сообщений приоритеты часто комбинируются с: