管理RabbitMQ中的消息锁定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了管理RabbitMQ中的消息锁定相关的知识,希望对你有一定的参考价值。

我试图以更加非传统的方式使用RabbitMQ(尽管此时我可以选择任何其他消息队列实现,如果需要)

我有一个队列(如果需要我可以有更多),客户正在异步获取N个消息。在他们完成工作后,我将结果从客户端发送到数据库。

我有两个问题:首先我不希望他们会在同一个消息上工作,其次我想要承认我不会丢失消息,以防我的客户关闭浏览器或停止工作。

我查看了文档并看到了TTL,这对我来说非常适合,如果我可以改变那条消息,那么超时不会被删除而是移动到另一个队列。找不到改变这种方法的方法。

此外,我看了确认选项,乍一看看我想要什么,该机制是这样工作的:当消费者收到消息他发送确认到队列时,我想我可以推迟这个确认并在工作时发送它在客户端完成。我的问题是我无法编程队列,如果任何消息没有得到确认,然后将其返回到队列(或另一个)。

我也发现如何做一个预定的消息,但它也没有帮助,因为我不希望消息将在五分钟内插入队列,我希望当客户收到消息时它将被锁定队列为5分钟,直到确认删除为止,否则将其返回队列。

我可以执行启用机制的临时队列吗?

如果有人可以帮助解决其中一个问题,或建议另一个架构或选项在另一个MQ中执行,那就太棒了。

资源:

确认:http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/

关于锁的帖子,但他的问题是一个批处理组件:Locks and batch fetch messages with RabbitMq

TTL:https://www.rabbitmq.com/ttl.html

安排消息:https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/

答案

我的问题是我无法编程队列,如果任何消息没有得到确认,然后将其返回到队列(或另一个)。

RabbitMQ无论如何都会这样做,所以你要做的就是关闭auto-ack标志,你想出来了

我想我可以延迟这个确认,并在客户端完成工作时发送它。

所以只需在完成处理消息后发送ACK。所有未确认的消息都会保留在队列中并重新发送给下一个消费者(或者当它再次启动时会重新发送给消费者,具体取决于您的设置)

以上是关于管理RabbitMQ中的消息锁定的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ管理台Purge大量消息堆积队列风险

RabbitMQ实战:运行和管理RabbitMQ

消息队列RabbitMq入门

获取 RabbitMQ 队列中的消息数

消息中间件-----RabbitMq管理集群

aws 中的 rabbitmq 自动缩放集群:管理缩放事件