一个接收端点上具有相同消息类型的多个使用者

时间:2019-02-14 07:30:55

标签: c# rabbitmq masstransit

在单个接收端点上使用相同消息类型的不同使用者是一种有效的解决方案,还是我们应该为每个使用者使用接收端点?

cfg.ReceiveEndpoint(host, "MyQueue", e =>
            {
                logger.LogInformation("Consuming enabled.");

                //register consumers with middleware components
                e.Consumer<MyConsumer>(context);
                e.Consumer<MyOtherConsumer>(context);
            })

public class MyConsumer : IConsumer<MyMessage> {}

public class MyOtherConsumer : IConsumer<MyMessage> {}

以上解决方案有效,每个消费者都收到消息。即使失败(例外)。

我为什么要问这个?当前的解决方案是每种消息类型只有一个使用者。使用者将接收到的消息传递到内部自定义可扩展管道进行处理。如果上述解决方案可行,我们可以删除或拥有自定义管道,而改为使用MassTransit。

1 个答案:

答案 0 :(得分:2)

是的,您可以在同一个端点上针对相同的消息类型注册多个使用方,MassTransit将处理将消息分发给这些使用方的情况。

您还可以自定义端点管道以及每个使用者的管道,以便可以将不同的筛选器应用于不同的使用者。

ec.Consumer<MyConsumer>(context, c => c.UseRetry(r => r.Interval(2,1000)));
ec.Consumer<MyOtherConsumer>(context, c => c.UseRetry(r => None()));

这是将MT重写为围绕管道(这是几年前的事,但仍然如此)以及如何创建GreenPipes的核心原因之一。

作为旁注,您可以将每个使用者放在单独的端点上,然后发布消息,这将为每个使用者提供自己的副本-并在需要时提供自己的执行上下文(包括重试和代理错误处理)。