Как я могу потреблять пакеты сообщений от rabbitmq? - PullRequest
0 голосов
/ 07 февраля 2019

Перед потреблением я установил

consumeChannel.Qos(5,0,false)

, но все равно получаю только одно сообщение, а не пакет из пяти.что я делаю не так?

полный код:

consumeChannel.Qos(5,0,false)
msgs, _ := consumeChannel.Consume("ticks", "", false, false, false, false, nil, )

for d := range msgs {
    println("Received a message: %s", d.Body)
    println("Done")
    //here will be some extra multiple message handling
    //d.Ack(false)
}

1 Ответ

0 голосов
/ 08 февраля 2019

, но все равно получаю только одно сообщение, а не пакет из пяти.что я делаю не так?

Вы не понимаете, как работает RabbitMQ и QoS / prefetch ( docs ) или как он взаимодействует с оператором range оператораGo client.

QoS не означает «отправка сообщений партиями», оно устанавливает ограничение на количество неподтвержденных сообщений на канале.Если бы вы удалили вызов d.Ack в своем коде и запустили цикл for на неопределенный срок, он запустился бы только на 5 итераций, а затем остановился бы, потому что RabbitMQ к тому времени прекратил бы доставку сообщений вашему потребителю.

Я не проверял код, но я предполагаю, что используемый вами клиент Go написан таким образом, что, как только сообщение получено и декодировано, оно доставляется на канал msgs.Когда вы подтверждаете сообщение в цикле, это указывает RabbitMQ, что на этот канал может быть доставлено еще одно сообщение.

Я предлагаю переписать ваш код, чтобы отследить, сколько сообщений было доставлено через msgs канал, выполняйте свою работу, а затем используйте множественное подтверждение , чтобы подтвердить их всех одновременно.


ПРИМЕЧАНИЕ: Команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы по StackOverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...