一个接收端点上具有相同消息类型的多个消费者
Multiple Consumers of the same message type on one receive endpoint
在单个接收端点上使用相同消息类型的不同消费者是否是一个有效的解决方案,还是我们应该为每个消费者使用一个接收端点?
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。
是的,您可以在同一个端点上注册多个消费者,以获得相同的消息类型,MassTransit 将处理向这些消费者发送消息的过程。
您还可以自定义端点管道,以及每个消费者的管道,以便可以将不同的过滤器应用于不同的消费者。
ec.Consumer<MyConsumer>(context, c => c.UseRetry(r => r.Interval(2,1000)));
ec.Consumer<MyOtherConsumer>(context, c => c.UseRetry(r => None()));
这是重写 MT 以围绕管道构建的核心原因之一(这是几年前的事了,但仍然如此)以及 GreenPipes 的创建方式。
作为旁注,您可以将每个消费者放在一个单独的端点上,并发布消息,这将为每个消费者提供自己的副本 - 如果需要,还可以提供自己的执行上下文(包括重试和代理错误处理)。
在单个接收端点上使用相同消息类型的不同消费者是否是一个有效的解决方案,还是我们应该为每个消费者使用一个接收端点?
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。
是的,您可以在同一个端点上注册多个消费者,以获得相同的消息类型,MassTransit 将处理向这些消费者发送消息的过程。
您还可以自定义端点管道,以及每个消费者的管道,以便可以将不同的过滤器应用于不同的消费者。
ec.Consumer<MyConsumer>(context, c => c.UseRetry(r => r.Interval(2,1000)));
ec.Consumer<MyOtherConsumer>(context, c => c.UseRetry(r => None()));
这是重写 MT 以围绕管道构建的核心原因之一(这是几年前的事了,但仍然如此)以及 GreenPipes 的创建方式。
作为旁注,您可以将每个消费者放在一个单独的端点上,并发布消息,这将为每个消费者提供自己的副本 - 如果需要,还可以提供自己的执行上下文(包括重试和代理错误处理)。