NServiceBus 7并发疑惑

NServiceBus 7 concurrency doubts

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

我对这个概念几乎没有怀疑:

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

例如:

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

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

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

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

这意味着您应该注意在同一端点处理的消​​息类型。它们通常应该具有相同的 SLA。您不希望一堆需要 50 毫秒处理的消息被大量处理 20 秒的消息挡住。

有些人会把这种情况发挥到极致,并为每种消息类型使用一个端点。这种级别的复杂性通常是不必要的,但它确实可以让您最终控制每种消息类型的可伸缩性。