go - 我如何消费来自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)
}
解决方案
但仍然只收到一条消息,而不是一包五个。我做错了什么?
您不了解 RabbitMQ 和 QoS / prefetch 如何工作(文档),或者它如何与range
Go 客户端的操作员交互。
QoS 并不意味着“批量发送消息”,它对通道上未确认消息的数量设置了限制。如果您要删除d.Ack
代码中的调用并for
无限期地运行循环,它只会运行 5 次迭代,然后停止,因为到那时 RabbitMQ 将停止向您的消费者传递消息。
我还没有查看代码,但我假设您正在使用的 Go 客户端的编写方式是,一旦收到并解码消息,它就会被传递到msgs
通道。当您在循环中确认消息时,它向 RabbitMQ 指示可以再向该通道传递一条消息。
我建议重新编写您的代码以跟踪通过通道传递了多少消息msgs
,完成您的工作,然后使用多重确认同时确认所有消息。
注意: RabbitMQ 团队会监控rabbitmq-users
邮件列表,有时只会在 StackOverflow 上回答问题。