【问题标题】:Unwanted round robin dispatching不需要的循环调度
【发布时间】:2015-10-11 06:10:16
【问题描述】:

我很难理解 RabbitMQ 中不同类型的绑定(交换)。其实我想实现某种模式,也想了解哪种交换/绑定/路由键组合适合这种模式。

我有以下内容:生成 3 种消息的生产者,3 个消费者,每种消息一个。生产者 P 生成 A、B 和 C 消息。消费者收到如下消息:ConsumerA只接收A消息,Consumer B只接收B消息,ConsumerC只接收C消息。这工作得很好。

然后我添加了第四个消费者 D,它应该接收 B 和 C 消息。当 B 消息生成时,消费者 B 和 D 都应该收到它。同样,当产生 C 消息时,应通知 C 和 D 消费者。取而代之的是,实际发生的是: 1. 消息 A 总是只发送给消费者 A(这没关系)。 2.消息B交替发送给消费者B和D(一次只给B,一次只给D,一次只给B,一次只给D等等)(错误) 3. 消息 C 交替发送给消费者 C 和 D(一次只发送给 C,一次只发送给 D,一次只发送给 C,一次只发送给 D,依此类推)(错误)

我做了一些阅读,我明白这是所谓的循环式调度,但这对我来说似乎没用。我希望能够将相同的消息传播给所有对此感兴趣的消费者。如果有 10 个消费者对一条消息感兴趣,我不希望只有其中一个接收消息而其他 9 个对此一无所知,我希望每次所有 10 个消费者都收到相同的消息。这对不同的模式/交换类型是否可行?我是否遗漏了一些关于 RabbitMQ 如何工作的明显内容?

这里有一些相关代码,感兴趣的人可以参考:http://pastebin.ca/3070838

(A表示红利,B表示游戏,C表示支付)

【问题讨论】:

    标签: c# .net rabbitmq


    【解决方案1】:

    这是给 Vor 的,我不知道如何在不剪切文本的情况下向他发布答案。

    我引用你给我的链接: “路由键设置为“quick.orange.rabbit”的消息将被传递到两个队列。消息“lazy.orange.elephant”也将发送给它们。另一方面,“quick.orange.fox”只会去第一个队列,而“lazy.brown.fox”只会去第二个。“lazy.pink.rabbit”只会被传递到第二个队列一次,即使它匹配两个绑定。“quick.brown。 fox" 不匹配任何绑定,因此将被丢弃。"

    主题交换对我来说听起来不对。主题交换看起来像是消息的生产者关心或至少知道谁应该使用每条消息。当新消费者对某些消息感兴趣或现有消费者对某些消息失去兴趣时,这种交换看起来应该知道,因此他可以相应地更新路由密钥,以便消息到达正确的队列。 这不是我想要的。我想要一个系统,无论在消费者方面发生什么,它对生产者都是 100% 透明的。生产者不需要向消费者生成带有提示的消息,他们应该只说“我刚刚生成了 A 类型的消息。交换,拥有这个消息并用它做任何你想做的事情,我不在乎”。然后交换与其他因素(交换类型、绑定、路由密钥等)一起决定谁得到消息。

    好的,我知道订阅同一个队列的 2 个消费者将生成循环调度,每个消费者将轮流收到一条消息发送到该队列的通知。知道这对未来很好。但是我应该使用什么模式让消息同时到达 2 个消费者,而生产者与消费者 100% 解耦,因为他不应该知道他的消息应该到达多少消费者?

    附言如果我要求对所有 4 种交换类型进行“傻瓜式”解释,是否太过分了?也许我比平均速度慢,但我确实阅读了手册和其他谷歌找到的文章,我仍然不清楚所有交换的具体内容以及它们何时有用。也许如果我了解这些交换类型,我会弄清楚如何实现第一篇文章中描述的场景。

    【讨论】:

      【解决方案2】:

      你遇到的问题:

      在您的情况下,您创建了 3 个单独的队列。当两个消费者订阅同一个队列时,RabbitMQ 将在消费者之间轮询消息。

      怎么做:

      您的设置将有 1 个公共交换(主题交换)。然后每个工作人员将创建自己的唯一队列,然后将其绑定到公共交换与所需的路由密钥。这样生产者会一直发布到同一个交易所,消费者会收到他们感兴趣的消息。

      看看ropic交流:https://www.rabbitmq.com/tutorials/tutorial-five-python.html

      【讨论】:

      • 谢谢,我会试一试,然后返回一个工作示例。
      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多