NServiceBus 7并发性怀疑



在NServicebus 7中,你可以设置并发性,这意味着你可以决定你的软件可以并行处理多少消息。这可以在NserviceBus端点级别完成。

我对这个概念有一些疑问:

  1. 并发是每个队列而不是每个消息类型?对吧?
  2. 如果我使用卫星,这意味着我将有N个不同的队列(例如:每个消息类型一个),并发性仍然是每个队列?
  3. 例如:

  1. 我配置了1个端点(即1个队列)并将并发级别设置为10。我管理5个不同的命令(处理程序)。所有命令都混合存储在同一个队列中。在这种情况下,端点每次能够从队列中获取10个命令,而不考虑类型,对吗?
  2. 在第二种情况下,我有5颗卫星管理5种消息类型,每种类型一个专用队列。在这种情况下,每个卫星每次能够从其队列中获取10条消息?

卫星是消息原始处理的高级功能,没有NServiceBus消息处理管道的所有优点。使用它们是不正常的—它们最常用于实现消息传输。例如,RabbitMQ传输使用卫星来实现一个特性,使端点实例可以单独寻址,所以你在代理上有一个QueueName队列和一个QueueName-InstanceName队列,这样另一个端点可以执行context.Reply()并将回复发送到发送原始命令的特定服务器。在任何情况下,每个卫星都单独管理其并发性,因为它是一个更低级的构造。

所以,是的,通过主队列的并发是针对端点实例的,而不是针对每个消息类型的,因为端点和队列之间存在1:1的关系,并且您不能按类型选择性地将消息从队列中取出。

因此,端点是可伸缩性的单位,既可以向上扩展(通过增加并发性),也可以向外扩展(通过在不同的服务器上添加更多端点实例)。

这意味着您应该注意在同一端点中处理的消息类型。它们通常应该具有相同的SLA。你不会希望一堆需要50ms来处理的消息被一堆处理时间只有20秒的消息所耽误。

有些人会将这一点发挥到极致,为每个消息类型设置一个端点。这种级别的复杂性通常是不必要的,但它确实为您提供了对每种消息类型的可伸缩性的最终控制。

最新更新