如何在不锁定队列的情况下通过NServiceBus发送大量消息?

Jos*_*del 1 c# nservicebus

所以我正在对NServiceBus进行一些性能评估,并且我意识到如果你试图同时发送所有1000条消息,它表现得非常奇怪...它实际上发送它们所有异步(这很好)但它锁定了队列处理程序.结果是处理程序无法处理任何消息,直到发件人完成发送所有消息.

该行为以两种略有不同的方式显示.

  • 在处理程序内部,如果你进行了大量的发送,看起来接收队列被锁定,直到处理程序完成(所以说你在每次发送之间添加线程休眠,接收器将不会开始处理消息,直到处理程序完成.

  • 如果我只是从一个新建的总线发送消息,那么一个小的睡眠会打破这种关系,但如果我只是在"一次"发送1000条消息,那么处理程序将不会得到第一个,直到写完最后一个,甚至虽然每一个(在那一点上)应该是一个秘密的电话.

这里有没有未记录的策略来批量发送或其他正在进行的操作......我知道你不会"想"通常这样做,但要理解从处理程序发送或从普通总线发送批处理时会发生什么知道非常重要;-).

jan*_*esk 5

默认情况下,NServiceBus消息处理程序包含在TransactionScope中.处理消息,您对业务数据所做的任何更新以及任何新消息的发送都将完成或回滚.这就是事务性消息传递的全部内容.

如果在消息处理程序中发送1000条消息,则在基础消息传递基础结构成功收到所有消息之前,它将无法完成.这可能需要一些时间,具体取决于您的硬件.

如果您想选择退出此默认安全方法,您可以执行以下操作.您可以禁用 NServiceBus端点的事务处理,也可以在发送消息时禁止环境事务范围.但请注意,您不再拥有任何交易保证,因此如果您在发送500条消息后发送500条消息,则会发送500条消息,而500条消息则不会发送.