Rabbitmq:要将同一个对象发送到多个端点,我们应该使用基于主题的发布者和订阅者还是一个条件订阅者

时间:2017-04-27 19:54:30

标签: c# rabbitmq

我们有三种不同类型的对象:  1. ObjectA  2. ObjectB

我们需要将这些对象信息发送到三个不同的API:  1. API A - 我们只需要发送ObjectA。  2. API B - 我们只需要发送ObjectB。  3. API AB - 我们需要发送ObjectA&对象B

由于这些对象将以非常高的频率推送到我们的系统并需要异步处理,因此我们决定使用rabbitmq将这些对象推送到各自的API。

我们有两种选择:

  1. 创建一个使用者:对象将作为NameValueCollection推送,如果其ObjectA推送到API A和API AB。如果是ObjectB,请将其推送到API B和API AB。

  2. 创建单独的使用者:为这三者分开消费者,并通过路由密钥路由消息来批准消费者,即消费者A寻找具有ObjectA消息的路由密钥的对象,对于消费者B是相同的,而消费者AB则寻找具有两个路由密钥的消息。

    哪种方法更好?第二个看起来是标准的,但第一个看起来更简单,更符合这个问题。

1 个答案:

答案 0 :(得分:1)

我想说“制作人”不应该担心哪个消费者最终会阅读这些消息,而应该只是将消息发布到一个独特的地方(主题类型的交换)但是可以使用路由键来标记来自给定类型的消息,例如:MyApi.ObjectAMyApi.ObjectB

使用适当的路由键意味着您可以将“路由”完全推迟到RabbitMQ。

然后,您可以创建多个队列(每个消费者一个):

  • 消费者A:绑定密钥= MyApi.ObjectA
  • 消费者B:绑定密钥= MyApi.ObjectB
  • 消费者AB:绑定密钥= MyApi.*

这意味着什么 - 消费者永远不会被A类消息打扰 - 消费者B永远不会被B类消息所困扰

因此,如果由于某种原因,类型A的消息多于B,则只会影响相关的消费者。您还可以添加特定类型的额外消费者,并仅扩展所需的部分。

拥有单独的队列也意味着您可以更轻松地控制队列的使用情况,并知道您是否需要扩展。