【问题标题】:RabbitMQ: try send message againRabbitMQ:尝试再次发送消息
【发布时间】:2012-12-21 10:34:14
【问题描述】:

我有 server 将消息发送到 MQ。 worker 回答时从队列中删除消息:

channel.basic_ack(delivery_tag=method_frame.delivery_tag)

但是当工作人员产生错误时,它不会回答关于良好交付的问题。 是否可以将此消息路由到其他工作人员或将此消息发送到队列末尾并稍后重试。 RabbitMQ 是否有设置消息超时的机制。超时后消息尝试再次发送给工作人员还是我需要自己实现?

【问题讨论】:

    标签: client-server rabbitmq mq


    【解决方案1】:

    如果您的工作人员没有确认消息,则它不会从队列中删除,但是如果工作人员和 rabbit-mq 之间的连接仍然存在,则 rabbit-mq 无法知道该消息不在工作人员缓冲区中。

    有几种方法可以解决这个问题,主要取决于您的应用程序结构。

    最简单的方法是将 prefetch 设置为 1,并确保在出现问题时重置 rabbitmq 和 worker 之间的连接。

    您也可以查看nacking your messages,但我不知道这是否会使他们重新排队。

    你当然也可以照你说的做,然后发送你进入另一个队列或类似的消息。但是请记住,如果您不确认您的消息,您最终将拥有比您真正想象的更大的队列,因为除非它们被确认,否则兔子不会从队列中删除项目(实际上这取决于您的配置队列)。

    【讨论】:

    • 感谢您的回答。我发送了json字符串,我想添加像TTL这样的参数。当消息未处理时,我添加一些时间标签并将其返回到队列中。是noraml还是不是?
    • 这取决于,我不太确定你在说什么类型的 TTL,是不是这个:rabbitmq.com/ttl.html?或者它只是您传递的 JSON 对象中的一个值?
    • 我告诉过元素到 JSON 中,我在处理来自消息的数据之前添加并检查它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多