NServiceBus 处理程序是否应该始终快速完成?

Should NServiceBus handlers always quickly complete?

[为清晰起见进行了编辑]

我不确定我是否理解正确。

根据这些指导性帖子,在 Saga 中,一切都应该简洁快捷:

也就是说你的saga里面应该没有业务逻辑,也没有if-else指令。它应该只是一个协调器,调用它应该计划为 'success-oriented' - 即:在调用 Saga 之前应该进行尽可能多的验证。

但是单独的处理程序(你称它们为 "independent handlers" 吗?),那些不在传奇中的处理程序呢?以下哪项对他们来说是正确的:

一个。 saga 之外的 NServiceBus 消息处理程序是否应该始终快速完成,并且如果有耗时的操作将其传递给线程并完成?

b。还是 "hog" 处理程序更好,这样 NServiceBus "knows" 这条消息被大量使用,并且可以采取相应的行动 - 即自动负载平衡,创建另一个实例在不同的过程甚至不同的机器上处理过程?

正确的走法是什么?

您能否在回答的同时提供一些示例代码,调用 Foo.DoTimeConsumingBar() 方法。

谢谢。

Inside the Saga everything should be concise and quick.

这个声明没有任何意义。你所说的简洁是什么意思?你说的快是什么意思? saga 将在 运行 所在的容器的限制内尽可能快地运行。

Should the NServiceBus message handlers outside a saga always complete quickly, and if there is a time-consuming action pass that on to a thread and complete?

除非您以这种方式构建处理程序,否则不会。如果您的消息处理过程很耗时,那么除了处理消息的处理程序实例之外没有其他进程。

Or is it better to "hog" the handler, and that way the NServiceBus "knows" that this message is being used with a heavy toll, and can take action accordingly - i.e. with automatic load balancing?

当运行多线程时,多个处理程序实例将可用于处理消息。每个处理程序实例仍将只处理一条消息,但这可以同时发生。因为只有一个消息源,即输入队列,所以这提供了您需要的 "load-balancing" 行为。

You are supposed to do everything you can so that there is no business logic inside the Saga.....You should be 'success oriented' doing as many validations as possible before the Saga, so that once you enter the Saga you are expecting to succeed

是的,sagas 应该只关注漫长的 运行ning 过程的编排,而不是它的细节。

鉴于上述情况,我将修改我对您最初问题之一的回答:

Should the NServiceBus message handlers outside a saga always complete quickly, and if there is a time-consuming action pass that on to a thread and complete?

我看不出有什么特别需要处理程序快速完成。 saga 的全部意义在于,如果不使用它,它将脱水到磁盘,因此 saga 并不是在等待占用内存,直到外部消息处理程序完成它们的工作。

关于你的另一个关于负载均衡的问题,我相信我的回答仍然基于我对问题的理解。

@pashute,您关于 Sagas 的陈述是正确的,应该不起作用 (I/O),并且应该充当长 运行 业务流程的编排者。

处理程序应该遵循 SRP Single Responsibility Principle,即使他们 I/O 密集,这仍然应该使他们保持精简。在 I/O 密集操作的情况下,distributor/load 平衡器将有助于扩展负载。

这有意义吗?