RabbitMQ 固定大小队列上的消息比预期多

时间:2021-04-16 15:03:50

标签: rabbitmq

我有一个发布者向移动电机的消费者发送消息。 电机有一个我无法访问的工作队列,它的工作速度比传入消息的速度慢,所以我试图控制消费者的流量。

为了在队列中不填满和造成交通拥堵的情况下保持更新和相关数据进入电机,我将 RabbitMQ 队列大小限制设置为 5,将 basicQos 设置为 1。

这个想法是RabbitMQ队列在填满时会丢弃旧的消息,所以最新的命令在队列的前面。 同样通过将 basicQos 设置为 1,我确保消费者不会从队列中获取所有消息并立即轰击电机,这正是我想要避免的,因为一旦命令发送到我就无法执行任何操作电机。 这样,消费者一条一条地从队列中获取消息,而新消息替换队列中的旧消息。 实际上,这会将瓶颈移至 RabbitMQ 队列而不是电机的队列。 我也不能检查电机的工作队列,所以所有的流量控制都必须在消费者身上完成。

我添加了 messageId 并进行了测试,发现在发布者关闭后很长一段时间内仍有许多消息来来往往。

我预计关闭后会收到大约 5 条消息,因为这是队列的大小,但我收到了数百条消息。

我还在回调中添加了几秒钟的睡眠时间,以确保这不是正在运行的机器人队列,但关闭后我仍然收到很多消息,我可以在日志中看到回调正在执行每次都被调用,所以它肯定仍然从某个地方收到消息。

请帮忙。 谢谢。

1 个答案:

答案 0 :(得分:1)

将确认移动到回调的末尾解决了问题。

我猜,通过将 basicQos 设置为 1,它确实会一个接一个地执行每条消息的回调,但在后台它不断从队列中抓取消息。 所以即使发布者关闭,消费者仍然有从队列中取出的消息,这些消息是我看到正在执行的消息。