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

C# Rabbitmq:要将同一对象发送到多个端点,我们应该使用基于主题的发布服务器和订阅服务器还是使用一个条件订阅服务器,c#,rabbitmq,C#,Rabbitmq,我们有三种不同类型的对象: 1.ObjectA 2.反对意见 我们需要将这些对象信息发送到三个不同的API: 1.API A-我们只需要发送ObjectA。 2.API B-我们只需要发送ObjectB。 3.API AB-我们需要发送ObjectA和ObjectB 由于这些对象将以非常高的频率推送到我们的系统,并且需要异步处理,因此我们决定使用rabbitmq将它们推送到各自的API 我们有两个选择: 创建一个使用者:对象将作为NameValueCollection推送,如果是对象A,则推送至

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

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

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

我们有两个选择:

  • 创建一个使用者:对象将作为NameValueCollection推送,如果是对象A,则推送至API A和API AB。如果是对象B,则推送至API B和API AB

  • 创建单独的使用者:将这三个使用者分开,并通过路由密钥将消息路由到相应的使用者,即consumerA查找具有ObjectA消息路由密钥的对象,与consumerB相同,而consumerAB查找具有两个路由密钥的消息

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

  • 我想说的是,“生产者”不必担心哪个消费者最终会阅读消息,只需将消息发布到一个独特的位置(类型交换主题),但可以使用路由键标记来自给定类型的消息,例如:
    MyApi.ObjectA
    MyApi.ObjectB

    使用适当的路由密钥意味着您可以完全将“路由”延迟到RabbitMQ

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

    • 使用者A:binding key=
      MyApi.ObjectA
    • 使用者B:binding key=
      MyApi.ObjectB
    • 消费者AB:binding key=
      MyApi.
    它的意思是 -消费者A永远不会被A类信息所困扰 -消费者B永远不会被B类消息所困扰

    因此,如果由于某种原因,类型A的消息多于类型B的消息,那么只有相关的消费者会受到影响。您还可以添加特定类型的额外使用者,并仅缩放所需的零件


    拥有独立的队列也意味着您可以更轻松地控制队列的使用,并知道是否需要扩大规模。

    明白了。但是,如果使用者需要将一些公共信息与对象A和对象B一起发送到API,我们需要两次命中DB/cache。对吗?如果一个消费者将不同类型的消息(即ObjectA、objectB)解列,或者一个消费者仅将一种类型的消息解列,会有什么危害