如何在RabbitMQ中收回邮件?

jkf*_*kff 13 message-queue amqp rabbitmq cancellation

我在RabbitMQ上有一个类似于作业队列的东西,并且在请求取消作业时,我想撤回尚未开始处理的任务(他们的消息未被确认),这对应于撤回这些消息来自他们被路由到的队列.

我没有在AMQP或RabbitMQ API中找到此功能; 也许我的搜索不够好?或者我是否必须使用解决方法(这不难,但仍然)?

cde*_*zaq 8

我会通过让工作人员检查某种权威数据源来确定作业是否应该继续来解决这个问题.例如,工作人员将检查作业在数据库中的状态,以查看作业是否已被取消.

对于处理作业的速度可能快于可以更新和读取权威商店的速度的情况,为其他特征换取速度的保证较少的数据存储可能是有用的.

这方面的一个例子是使用Redis作为存储来取消消息的处理,而不是像MySQL这样的关系数据库.Redis非常快,但对它所拥有的数据提供的保证较少,而MySQL速度要慢得多,但对它所拥有的数据提供了更多的保证.

最后,使用其他来源检查是否处理消息的概念是相同的,但实现方式取决于您的特定方案.


Ton*_*nes 5

RabbitMQ 不允许您在消息入队后修改或删除消息。为此,您需要某种数据库来保存每个作业的状态,并使用 RabbitMQ 将该状态的变化通知相关方。

对于较小的容量,您可以将每个作业与一个队列混在一起。创建队列,将工作描述发布到队列,向工作人员宣布队列名称。如果作业在处理前需要取消,则删除作业的队列;当工作人员来获取工作描述时,他们会注意到队列已经消失。

更轻量级且通常更好的是使用 redis 或其他键/值存储来保存作业状态(删除或不存在的记录意味着取消或不存在的作业)并使用 rabbitmq 来通知键中的新/删除/更改记录/价值存储。


Ser*_*kov 3

至少有两种方法可以实现您的目标:

  • 如果消息成功发布并且您需要将它们从已知队列中删除,则订阅它并在生产者中使用它们。 (4认同)
  • 不,这解决了另一个问题。我不需要在消费者端拒绝消息,我想从生产者端取消它的传递,这样消息就不会到达消费者,就像它根本不存在一样。在我的问题中,消费者无法决定是否应该拒绝消息。 (2认同)