首页 > 解决方案 > 我如何消费来自rabbitmq的一批消息?

问题描述

在消费之前我设置

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)
}

标签: gorabbitmq

解决方案


但仍然只收到一条消息,而不是一包五个。我做错了什么?

您不了解 RabbitMQ 和 QoS / prefetch 如何工作(文档),或者它如何与rangeGo 客户端的操作员交互。

QoS 并不意味着“批量发送消息”,它对通道上未确认消息的数量设置了限制。如果您要删除d.Ack代码中的调用并for无限期地运行循环,它只会运行 5 次迭代,然后停止,因为到那时 RabbitMQ 将停止向您的消费者传递消息。

我还没有查看代码,但我假设您正在使用的 Go 客户端的编写方式是,一旦收到并解码消息,它就会被传递到msgs通道。当您在循环中确认消息时,它向 RabbitMQ 指示可以再向该通道传递一条消息。

我建议重新编写您的代码以跟踪通过通道传递了多少消息msgs,完成您的工作,然后使用多重确认同时确认所有消息。


注意: RabbitMQ 团队会监控rabbitmq-users 邮件列表,有时只会在 StackOverflow 上回答问题。


推荐阅读