【问题标题】:Cancelling an un-acked message in RabbitMQ取消 RabbitMQ 中未确认的消息
【发布时间】:2015-11-24 02:53:36
【问题描述】:

我有一项服务,它通过 RabbitMQ 对工作人员进行处理。消息带有 TTL 发送,worker 直到成功完成消息中发送的任务后才会确认消息。

任务进程将监视工作人员超时,如果工作人员超过超时时间,它将被终止。由于消息没有被确认,消息会立即重新排队,下一个工作人员将接收消息(这在我的场景中很有用,因为工作人员不可靠并且可能会失败,但后续尝试通常会成功。

但是,我还希望能够取消消息。终止和重新创建工作进程是正常过程(它是单线程的,所以我不能向工作人员发送单独的“取消”消息)。但是,如果没有超过 TTL,这样做会导致消息立即重新排队。

我找到的唯一建议解决方案是here,它建议使用单独的数据源来检查消息是否仍然有效。但是,这个答案既 a) 陈旧又 b) 不方便。

RabbitMQ 是否提供了一种在消息放入队列后取消消息的方法?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    很遗憾,rabbitmq 没有办法取消消息。

    如果无法向您的消费者发送“取消”消息,您可能必须执行其他帖子所建议的操作。

    另一个需要考虑的选项:消息处理应该是幂等的。也就是说,多次处理同一消息应该只会导致期望的结果出现一次(第一次处理)。

    幂等性通常通过在消息传递中使用相关 ID 来实现。您可以将相关 ID 附加到您的消息中,然后检查数据库或其他服务以查看是否仍应处理该消息。如果您想“取消”该消息,您可以使用该特定相关 ID 更新其他数据库/服务,以说“此消息已被处理”或“已被取消”或类似的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多