NServiceBus 7并发疑惑
NServiceBus 7 concurrency doubts
在 NServicebus 7 中,您可以设置并发性,这意味着您可以决定您的软件可以并行处理队列中的多少条消息。
这可以在 NserviceBus 端点级别完成。
我对这个概念几乎没有怀疑:
- 并发是按队列而不是按消息类型?对吧?
- 如果我使用卫星,这意味着我将有 N 个不同的队列(例如:每个消息类型一个),并发性仍然是每个队列?
例如:
- 我已经配置了 1 个端点(所以 1 个队列)并将并发级别设置为 10。我管理 5 个不同的命令(处理程序)。所有命令都存储在同一个队列中,混合。在这种情况下,端点每次能够从队列中获取 10 个命令而不考虑类型,对吗?
- 在第二种情况下,我有 5 个卫星管理 5 种消息类型,每种类型有 1 个专用队列。在这种情况下,每颗卫星每次能够从其队列中获取 10 条消息?
Satellite 是一种高级功能,用于消息的原始处理,但没有 NServiceBus 消息处理管道的所有优势。使用它们是不正常的——它们最常在实现消息传输时使用。例如,RabbitMQ 传输使用 Satellite 来实现使端点实例可单独寻址的功能,因此您在代理上有一个 QueueName
队列和一个 QueueName-InstanceName
队列,这样另一个端点可以做 context.Reply()
并让回复转到发送原始命令的特定服务器。在任何情况下,每个卫星都单独管理其并发性,因为它是一个较低级别的构造。
所以是的,通过主队列的并发是针对端点实例的,而不是针对每个消息类型的,因为端点和队列之间存在 1:1 关系,并且您不能有选择地从队列中提取消息按类型。
因此,端点是您的可扩展性单位,可以向上扩展(通过增加并发性)或向外扩展(通过在不同服务器上添加更多端点实例)。
这意味着您应该注意在同一端点处理的消息类型。它们通常应该具有相同的 SLA。您不希望一堆需要 50 毫秒处理的消息被大量处理 20 秒的消息挡住。
有些人会把这种情况发挥到极致,并为每种消息类型使用一个端点。这种级别的复杂性通常是不必要的,但它确实可以让您最终控制每种消息类型的可伸缩性。
在 NServicebus 7 中,您可以设置并发性,这意味着您可以决定您的软件可以并行处理队列中的多少条消息。 这可以在 NserviceBus 端点级别完成。
我对这个概念几乎没有怀疑:
- 并发是按队列而不是按消息类型?对吧?
- 如果我使用卫星,这意味着我将有 N 个不同的队列(例如:每个消息类型一个),并发性仍然是每个队列?
例如:
- 我已经配置了 1 个端点(所以 1 个队列)并将并发级别设置为 10。我管理 5 个不同的命令(处理程序)。所有命令都存储在同一个队列中,混合。在这种情况下,端点每次能够从队列中获取 10 个命令而不考虑类型,对吗?
- 在第二种情况下,我有 5 个卫星管理 5 种消息类型,每种类型有 1 个专用队列。在这种情况下,每颗卫星每次能够从其队列中获取 10 条消息?
Satellite 是一种高级功能,用于消息的原始处理,但没有 NServiceBus 消息处理管道的所有优势。使用它们是不正常的——它们最常在实现消息传输时使用。例如,RabbitMQ 传输使用 Satellite 来实现使端点实例可单独寻址的功能,因此您在代理上有一个 QueueName
队列和一个 QueueName-InstanceName
队列,这样另一个端点可以做 context.Reply()
并让回复转到发送原始命令的特定服务器。在任何情况下,每个卫星都单独管理其并发性,因为它是一个较低级别的构造。
所以是的,通过主队列的并发是针对端点实例的,而不是针对每个消息类型的,因为端点和队列之间存在 1:1 关系,并且您不能有选择地从队列中提取消息按类型。
因此,端点是您的可扩展性单位,可以向上扩展(通过增加并发性)或向外扩展(通过在不同服务器上添加更多端点实例)。
这意味着您应该注意在同一端点处理的消息类型。它们通常应该具有相同的 SLA。您不希望一堆需要 50 毫秒处理的消息被大量处理 20 秒的消息挡住。
有些人会把这种情况发挥到极致,并为每种消息类型使用一个端点。这种级别的复杂性通常是不必要的,但它确实可以让您最终控制每种消息类型的可伸缩性。