使用RabbitMQ进行动态队列创建

19
我一直在学习RabbitMQ的各种拓扑结构,但是我找不到有关从生产者中动态创建队列(即声明队列)的参考资料。 其想法是根据特定事件(例如HTTP请求)动态创建临时队列,并设置TTL并以事件ID命名。 然后消费者可以订阅主题“event.*”并合并与其相关的所有消息。
例如:
1.收到HTTP POST“创建用户”的请求 2.生产者创建一个名为user.ID的队列 3.将所有涉及该用户的后续消息推送到其队列中(例如“添加用户名”,“添加电子邮件”...) 4.工作程序被分配到一个随机队列“user.*”并将所有内容合并到用户帐户中 5.队列在TTL过期后会自动删除
那么,这种情况在RabbitMQ中可行吗?
1个回答

7
基本上,您想要做的是使用RabbitMQ缓冲等待在一组队列中的消息(这正是消息队列系统的定义)。 :)
假设您从消费方面知道您的队列,您将没有任何问题。生产者不能创建队列的限制不存在。作为一个警告,当队列过期时,队列中的所有消息都将被丢弃(或可选择将它们设置为转到死信队列)。
您尝试过什么代码?
编辑
根据您的评论进一步澄清 - 您正在寻找"通配符消费"而不是通配符发布。目前RabbitMQ不支持这样的拓扑结构(this post请求类似的功能)。
您需要做的是定期枚举队列(使用RabbitMQ API);随后,您的应用程序可以决定从哪些队列中进行消费。当队列被删除时,消费者会自动关闭。

特别说明 需要理解的是,这里所要求的是一种反模式。使用队列的系统的典型行为是根据内容将消息路由到队列中。因此,一个正确协调的系统应该有一组工作人员在一个或多个静态定义的队列上操作。不同的工作人员可能会选择不同的队列,这取决于专业化程度。当一系列交互导致消息被发布到队列时,分配给队列的工作人员将按照先来先服务的方式处理消息(但是,正如this post所讨论的那样,无法保证多个消费者的顺序)。然后,期望的系统行为就会出现,这是由执行各种函数操作队列的工作人员的组合形成的。


这就是我试图避免的,提前知道消费方队列的情况。难道没有按模式消费的方法吗?比如说,我想让一个工作进程消费所有匹配 log.* 的队列? - 3XX0
2
消费并不像发布那样简单。在RabbitMQ中,你必须知道你想要从哪个队列中消费。通过RabbitMQ API枚举队列以确定它们是相对容易的。 - theMayer
没问题。我很好奇为什么你不想把所有的消息都倒入一个队列中(基于主题路由)? - theMayer
我想说的是,设计应该注重简洁和效率。在这种设计中,工作人员只是“合并器”,他们获取一个队列,将其中所有消息合并成一个对象,然后切换到另一个队列(队列由RMQ进行垃圾回收)。这不需要额外的步骤来排序和按消息ID分发。对吧? - 3XX0
是的,这很有趣。 - theMayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接