我们有三种不同类型的对象: 1. ObjectA 2. ObjectB
我们需要将这些对象信息发送到三个不同的API: 1. API A - 我们只需要发送ObjectA。 2. API B - 我们只需要发送ObjectB。 3. API AB - 我们需要发送ObjectA&对象B
由于这些对象将以非常高的频率推送到我们的系统并需要异步处理,因此我们决定使用rabbitmq将这些对象推送到各自的API。
我们有两种选择:
创建一个使用者:对象将作为NameValueCollection推送,如果其ObjectA推送到API A和API AB。如果是ObjectB,请将其推送到API B和API AB。
创建单独的使用者:为这三者分开消费者,并通过路由密钥路由消息来批准消费者,即消费者A寻找具有ObjectA消息的路由密钥的对象,对于消费者B是相同的,而消费者AB则寻找具有两个路由密钥的消息。
哪种方法更好?第二个看起来是标准的,但第一个看起来更简单,更符合这个问题。
答案 0 :(得分:1)
我想说“制作人”不应该担心哪个消费者最终会阅读这些消息,而应该只是将消息发布到一个独特的地方(主题类型的交换)但是可以使用路由键来标记来自给定类型的消息,例如:MyApi.ObjectA
和MyApi.ObjectB
。
使用适当的路由键意味着您可以将“路由”完全推迟到RabbitMQ。
然后,您可以创建多个队列(每个消费者一个):
MyApi.ObjectA
MyApi.ObjectB
MyApi.*
这意味着什么 - 消费者永远不会被A类消息打扰 - 消费者B永远不会被B类消息所困扰
因此,如果由于某种原因,类型A的消息多于B,则只会影响相关的消费者。您还可以添加特定类型的额外消费者,并仅扩展所需的部分。
拥有单独的队列也意味着您可以更轻松地控制队列的使用情况,并知道您是否需要扩展。