我有一个服务,任务工作者通过RabbitMQ处理。消息与TTL一起发送,工作人员在成功完成消息中发送的任务之前不会确认消息。
任务处理过程将监视工作人员的超时时间,如果工作人员超过超时时间,则会终止。由于消息不准确,消息将立即重新排队,下一个工作人员将接收消息(这在我的方案中非常有用,因为工作人员不可靠并且可能会失败,但后续尝试通常会成功
但是,我还希望能够取消消息。终止和重新创建工作进程是正常的过程(它是单线程的,因此我无法向工作人员发送单独的“取消”消息)。但是,如果未超过TTL,这样做会导致消息立即重新排队。
我发现的唯一建议解决方案是here,它建议使用单独的数据源来检查邮件是否仍然有效。但是,答案既a)旧又b)不方便。
RabbitMQ是否提供了在消息被放入队列后取消消息的方法?
答案 0 :(得分:0)
不幸的是,rabbitmq无法取消消息。
无法发送"取消"给消费者的信息,你可能需要做一些其他帖子建议的事情。
另一个需要考虑的选择:消息处理应该是幂等的。也就是说,多次处理同一条消息只会导致所需的结果发生一次(第一次处理)。
通常通过在消息传递中使用correlationid来实现幂等性。您可以将correlationid附加到邮件中,然后检查数据库或其他服务以查看是否仍应处理该邮件。如果你想"取消"在消息中,您将使用该特定的相关关系更新其他数据库/服务以说明"这个已经处理过了#34;或者"已被取消"或类似的东西。