Pika python ждет RabbitMQ Publisher, если очередь достигает предела

У меня есть сценарий, скрипт python, который будет публиковать, скажем, 150 КБ сообщений с максимальным размером каждого сообщения 10 КБ. Затем я установлю ограничение очереди на максимум 5000 сообщений. Затем издатель будет публиковать сообщение в очереди, пока не будет достигнуто ограничение в 5000 сообщений. Затем потребитель попытается использовать сообщение.

Я хочу спросить, может ли издатель ждать публикации сообщения, если очередь заполнена? без удаления сообщения. Еще раз проверит, доступна ли очередь, затем издатель опубликует данные.


person BIlly Sutomo    schedule 05.06.2018    source источник
comment
Я предполагаю, что если очередь будет заполнена, то pika вызовет исключение. Не могли бы вы попробовать установить максимальный размер очереди на что-то очень маленькое и посмотреть, что произойдет?   -  person Jim Wright    schedule 05.06.2018
comment
Я уже пробовал это, установите x-max-length на 10. Используйте basic_publish, но всегда возвращайте true, даже если очередь заполнена.   -  person BIlly Sutomo    schedule 05.06.2018
comment
Когда вы это делаете, кажется ли, что все сообщения поставлены в очередь или некоторые из них молча терпят неудачу? Возможно, basic_publish блокирует, пока не сможет опубликовать.   -  person Jim Wright    schedule 05.06.2018


Ответы (1)


Команда RabbitMQ следит за списком рассылки rabbitmq-users и лишь иногда отвечает на вопросы по Переполнение стека.


Если вы используете новую версию RabbitMQ (например, 3.7.5), вы можете установить overflow поведение до reject-publish. Затем в своем коде используйте метод channel_instance.confirm_delivery(), чтобы включить подтверждение издателя. Наконец, когда лимит очереди будет достигнут, в ваш код будет отправлено сообщение basic.nack, которое вызовет исключение NackError, которое вы сможете перехватить.

person Luke Bakken    schedule 05.06.2018
comment
В этом решении говорилось, что сообщение будет отброшено, когда очередь будет заполнена, но я не хочу отбрасывать сообщение. Я должен убедиться, что все сообщения вставлены в очередь. - person BIlly Sutomo; 06.06.2018
comment
Мой ответ правильный. Пожалуйста, перечитайте этот документ внимательно. Вы должны объединить reject-publish с подтверждениями издателя, и вы получите отрицательные подтверждения. Вот почему я упомянул вызов метода confirm_delivery. Затем ваше приложение будет отвечать за перехват NackError и повторную попытку публикации через определенный вами период времени. - person Luke Bakken; 07.06.2018