【问题标题】:NServiceBus 7 concurrency doubtsNServiceBus 7 并发疑惑
【发布时间】:2021-02-26 17:37:07
【问题描述】:

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

我对这个概念没有什么疑问:

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

例如:

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

【问题讨论】:

    标签: c# concurrency nservicebus


    【解决方案1】:

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

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

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

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

    有些人会将这一点发挥到极致,每种消息类型都使用一个端点。这种复杂程度通常不是必需的,但它确实使您能够最终控制每种消息类型的可伸缩性。

    【讨论】:

    • 感谢您非常明确的回答!是的,就我而言,我决定为每种消息类型创建 1 个端点,以完全控制每条消息的并发性。
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2013-06-24
    • 2017-02-16
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多