Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RabbitMQ动态创建队列_Rabbitmq_Task Queue - Fatal编程技术网

使用RabbitMQ动态创建队列

使用RabbitMQ动态创建队列,rabbitmq,task-queue,Rabbitmq,Task Queue,我一直在学习RabbitMQ的各种拓扑,但是,我找不到任何对生产者发出的动态队列创建(也称为声明队列)的引用。 其思想是根据特定事件(例如HTTP请求)动态创建队列。队列将是临时的,带有TTL集,并以事件ID命名。 然后,消费者可以订阅主题“event.*”并合并与之相关的所有消息 示例: 收到HTTP POST“创建用户” 生产者创建一个队列user.ID 推送队列中用户的所有后续消息(例如“添加用户名”、“添加电子邮件”…) worker被分配到一个随机队列“user.*”,并将所有内容合并

我一直在学习RabbitMQ的各种拓扑,但是,我找不到任何对生产者发出的动态队列创建(也称为声明队列)的引用。 其思想是根据特定事件(例如HTTP请求)动态创建队列。队列将是临时的,带有TTL集,并以事件ID命名。 然后,消费者可以订阅主题“event.*”并合并与之相关的所有消息

示例:

  • 收到HTTP POST“创建用户”
  • 生产者创建一个队列user.ID
  • 推送队列中用户的所有后续消息(例如“添加用户名”、“添加电子邮件”…)
  • worker被分配到一个随机队列“user.*”,并将所有内容合并到一个用户帐户中
  • 队列在TTL过期后自动删除

  • 现在,这个场景对RabbitMQ可行吗?

    本质上,您要做的是使用RabbitMQ缓冲在一组队列中等待的消息(这是消息队列系统定义的功能)。:)

    假设您知道消费端的队列是什么,您就不会有任何问题。不存在生产者不能创建队列的约束。作为警告,当队列过期时,队列中的所有消息都将被丢弃(或者可以选择将它们设置为转到死信队列)

    你试过什么代码

    编辑 进一步澄清后(从您的评论)-您正在寻找“通配符消费”与通配符发布。RabbitMQ目前不支持这种拓扑(要求提供类似的功能)

    您需要做的是定期枚举队列(使用RabbitMQ API);接下来,你的应用程序可以决定从哪些应用程序中消费。删除队列时,使用者将自动关闭

    特别注意事项
    应该理解,这里所问的是一种反模式。使用队列的系统的典型行为是根据内容将消息路由到队列。因此,一个经过适当编排的系统将有一组工人在一个或多个静态定义的队列上操作。不同的工人可能会排不同的队,这取决于专业化程度。当一系列交互导致消息被发布到队列时,分配给队列的工作人员将以先到先得的方式处理消息(但是,正如所讨论的,不能保证多个消费者的顺序)。然后,期望的系统行为表现为在队列上执行各种功能的工作人员的组合。

    这正是我试图避免的,因为我事先知道了消费端的队列。难道没有什么东西可以按模式消费吗?假设我希望工作人员使用与日志匹配的任何队列。*?使用与发布不同。您必须知道要从RabbitMQ中使用的队列。从RabbitMQ api中枚举队列以确定它们是什么相对来说比较简单。没问题。我很想知道为什么您不想将所有消息转储到一个队列中(基于主题路由)?好吧,我想简单高效。在这种设计中,工作人员只是“合并”,他们接受一个队列,构建一个对象,合并其中的所有消息,然后切换到另一个队列(队列由RMQ垃圾收集)。这不需要额外的步骤,包括按消息ID进行排序和调度。不需要吗?是的,这很有趣。