我有将消息发送到 MQ的服务器。工作人员回答时从队列中删除消息:
channel.basic_ack(delivery_tag=method_frame.delivery_tag)
但是当工作人员产生错误时,它不会回答良好的交付情况。是否可以将此消息路由到其他工作人员或将此消息发送到队列末尾并稍后重试。RabbitMQ 是否有设置消息超时的机制。当超时结束消息尝试再次发送给工作人员还是我需要自己实现它?
我有将消息发送到 MQ的服务器。工作人员回答时从队列中删除消息:
channel.basic_ack(delivery_tag=method_frame.delivery_tag)
但是当工作人员产生错误时,它不会回答良好的交付情况。是否可以将此消息路由到其他工作人员或将此消息发送到队列末尾并稍后重试。RabbitMQ 是否有设置消息超时的机制。当超时结束消息尝试再次发送给工作人员还是我需要自己实现它?
如果您的工作人员没有确认该消息,则它不会从队列中删除,但是如果工作人员和 rabbit-mq 之间的连接仍然存在,则 rabbit-mq 无法知道该消息不在工作人员缓冲区中。
有几种方法可以解决这个问题,主要取决于您的应用程序结构。
最简单的方法是将 prefetch 设置为 1,并确保在出现问题时重置 rabbitmq 和 worker 之间的连接。
您也可以考虑整理您的消息,但我不知道这是否会使它们重新排队。
你当然也可以照你说的做,然后发送你进入另一个队列或类似的消息。但是请记住,如果您不确认您的消息,您最终将拥有比您真正想象的更大的队列,因为除非它们被确认,否则兔子不会从队列中删除项目(实际上这取决于您的配置队列)。