Почему циклический вызов требуется при использовании из очереди?

Я пытаюсь потреблять из кроличьих очередей, используя пика и витая:

  1. Постоянно (новое сообщение -> потреблять)
  2. Один раз (новое сообщение -> потреблять один раз, не потреблять снова, пока я не скажу)

Единственный вход у меня есть, это пример. Он охватывает вариант использования 1. Как насчет варианта использования 2?

не basic_consume реализован таким образом, что он будет "уведомлять", когда новое сообщение готово? Почему это моя "работа", чтобы начать цикл? Кажется, что опрос против шаблона цикла событий в витой, нет?

При выполнении запроса http с витой, он отправляет запрос и продолжает выполнение (через отложенные), как только он возвращается. Почему это не работает в RabbitMQ/pika?

Вот как я ожидал, что это сработает:

  1. подписаться на очередь
  2. потреблять из очереди (не срабатывает сразу, если в очереди нет сообщения, срабатывает каждый раз, когда в очереди появляется новое сообщение, пока я игнорирую qos.)

Как мне потреблять одно сообщение, например basic_get? Нужно ли начинать цикл, и как только я получу сообщение, остановим его?

1 ответ

Решение

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


Вы задаете несколько вопросов, поэтому я постараюсь ответить на них все. Я один из сопровождающих Пики, но я не так знаком с Twisted, как другие адаптеры подключения.

Разве basic_consume не реализован таким образом, чтобы он "уведомлял", когда новое сообщение готово? Почему это моя "работа", чтобы начать цикл? Кажется, что опрос против шаблона цикла событий в витой, нет?

Twisted документация дляLoopingCall утверждает это:

Вызовите функцию повторно. Если f возвращает отложенное, переназначение не произойдет, пока отложенное не сработает.

Пример кода использует @defer.inlineCallbacks и yield оператор для возврата отложенных функций. Так, LoopingCall не будет вызывать функцию повторно, она будет только планировать новый вызов после того, как отложено срабатывание.

Вот как я могу ожидать, что это будет работать... потреблять из очереди (не срабатывает сразу, если в очереди нет сообщения, будет срабатывать каждый раз, когда в очереди появляется новое сообщение, сейчас я игнорирую qos.)

Именно так работает пример кода.

Как мне потреблять одно сообщение, например basic_get? Нужно ли начинать цикл, и как только я получу сообщение, остановим его?

Если вы установите предварительную выборку (QoS) в 1то RabbitMQ отправит только одно сообщение потребителю и не отправит следующее, пока первое не будет подтверждено basic_ack,

Другие вопросы по тегам