NServiceBus 7 并发疑惑

问题描述

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

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

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

例如:

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

解决方法

卫星是用于原始消息处理的高级功能,但没有 NServiceBus 消息处理管道的所有优点。使用它们是不正常的——它们在实现消息传输时最常使用。例如,RabbitMQ 传输使用卫星作为使端点实例可单独寻址的功能,因此您在代理上有一个 QueueName 队列和一个 QueueName-InstanceName 队列,以便另一个端点可以执行 {{ 1}} 并将回复发送到发送原始命令的特定服务器。在任何情况下,每个卫星都单独管理其并发性,因为它是一个更底层的结构。

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

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

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

有些人会将这一点发挥到极致,并为每种消息类型配备一个端点。这种级别的复杂性通常不是必需的,但它确实让您可以最终控制每种消息类型的可扩展性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...