【问题标题】:Dynamic queue creation with RabbitMQ使用 RabbitMQ 创建动态队列
【发布时间】:2014-02-11 11:12:22
【问题描述】:

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

示例:

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

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

【问题讨论】:

    标签: rabbitmq task-queue


    【解决方案1】:

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

    假设您从消费方知道您的队列是什么,您不会有任何问题。生产者不能创建队列是没有限制的。需要注意的是,当队列过期时,队列中的所有消息都将被丢弃(或者可以选择将它们设置为进入死信队列)。

    你试过什么代码?

    编辑

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

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

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

    【讨论】:

    • 这就是我试图避免的,提前知道消费端的队列。模式没有东西可以消费吗?假设我希望一个工作人员使用任何队列匹配日志。*?
    • 消费不像出版。你必须知道你想在 RabbitMQ 中使用的队列。从 RabbitMQ api 枚举队列以确定它们是什么是相对简单的。
    • 没问题。我很想知道为什么您不希望将所有消息都转储到一个队列中(基于主题路由)?
    • 好吧,我猜是简单和高效。在这个设计中,工作者只是“合并”,他们接受一个队列,构建一个对象来合并其中的所有消息并切换到另一个对象(队列被 RMQ 垃圾收集)。这不需要涉及按消息 ID 进行排序和分派的额外步骤。没有?
    • 是的,很有趣。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2011-12-15
    • 1970-01-01
    • 2020-04-10
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多