Есть ли способ для RabbitMQ STOMP прекратить использование сообщений до тех пор, пока предыдущее не будет подтверждено?

Я использую RabbitMQ Web-STOMP в своем проекте, и он мне очень подходит, но с ним есть одна проблема. Когда потребитель подписывается на очередь, он мгновенно получает все сообщения из очереди. В моем случае задача сообщения может занять много времени, и потребителю необходимо получить следующее сообщение из очереди только тогда, когда предыдущее было завершено.

Все работает нормально, когда публикация начинается после того, как потребители подписаны, но когда в очереди уже есть сообщения, первый подписанный потребитель получит их все, а другие останутся бесплатными. Есть ли что-нибудь вроде метода node-amqp queue.shift () для использования следующего сообщения только тогда, когда предыдущее подтверждено?


person Leto III    schedule 29.11.2012    source источник


Ответы (1)


(Какой клиент вы используете?)

Ответ на ваш вопрос: basic_qos, см. справочник по amqp и выполните поиск для basic.qos

В C # API вы должны сделать следующее:

int prefetch = 10;

IModel channel = connection.CreateModel(); //where connection is IConnection
channel.basic_qos(0, prefetch, false);

Размер предварительной выборки можно использовать, чтобы сообщить серверу rabbitmq, сколько сообщений отправить потребителю, пока они не будут подтверждены. Размер предварительной выборки игнорируется, если установлена ​​опция NO-ACK.

Имейте в виду, что установка этого значения может потенциально повлиять на производительность. Взгляните на это.

person kzhen    schedule 29.11.2012
comment
Я использую RabbitMQ Web- STOMP с JS браузера. Я уже знаю, как с этим справиться, используя C # или даже node.js, но есть ли QoS для STOMP? - person Leto III; 30.11.2012
comment
Установка заголовка prefetch: 1 CONNECT и заголовка ack: client для SUBSCRIBE у меня не работает ... - person Leto III; 01.12.2012
comment
Где были мои глаза! Конечно, заголовок prefetch-count: 1 для SUBSCRIBE - это ответ, спасибо! - person Leto III; 09.12.2012