不需要的循环调度

时间:2015-07-21 16:46:56

标签: c# .net rabbitmq

我正在努力了解RabbitMQ中不同类型的绑定(交换)。实际上我想实现某种模式,并且还要了解哪种交换/绑定/ routingkey组合适合这种模式。

我有以下内容:一个生产者,它生成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表示付款)

2 个答案:

答案 0 :(得分:1)

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

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

主题交换对我来说听起来不对。主题交换看起来像消息的生产者关心或者至少知道谁应该消费每个消息。当新消费者对某些消息感兴趣或现有消费者对某些消息失去兴趣时,这种交换看起来就像产品应该知道的那样,因此他可以相应地更新路由密钥,从而使消息到达正确的队列。 这不是我想要的。我想要一个系统,无论消费者身上发生什么,它对生产者都是100%透明的。制作人不应该向消费者提供带有提示的消息,他们应该只说“我刚刚制作了一个类型为A的消息。交换,有这个消息并随心所欲地做任何事,我不在乎”。然后交换以及其他因素(交换类型,绑定,路由键等)应该决定谁获取消息。

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

P.S。如果我要求所有4种交换类型的“傻瓜”解释,这太过分了吗?也许我比平均水平慢,但我确实阅读了手册和谷歌发现的其他文章,我仍然不清楚所有交易所的具体情况以及它们何时有用。也许如果我了解这些交换类型,我将自己弄清楚如何实现第一篇文章中描述的场景。

答案 1 :(得分:0)

你遇到的问题:

在您的情况下,您创建3个单独的队列。当两个消费者订阅相同的queu时,RabbitMQ将在消费者之间循环消息。

如何做到:

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

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