在RabbitMQ中管理对消息的锁定

时间:2016-10-26 10:10:32

标签: rabbitmq locking zeromq

我试图以更加非常规的方式使用RabbitMQ(尽管此时我可以根据需要选择任何其他消息队列实现)

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

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

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

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

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

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

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

资源:

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

关于锁的帖子,但他的问题是一个batcher组件: 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/

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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