消费之前我定

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/预取的工作原理(docs),或者它与Go客户端的range运算符如何交互。

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

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

我建议重新编写代码,以跟踪通过msgs channel 传递了多少消息,进行工作,然后使用multiple acknowledgement同时确认所有消息。

注意:RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

10-02 00:38
查看更多