0

[为清晰而编辑]

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

根据这些指导性的帖子,在 Saga 中,一切都应该简明扼要:

  • 乔纳森奥利弗的总结:blog.jonathanoliver.com/...
  • Udi Dahan 的原文:skillsmatter.com/skillscasts/...
  • 和一些早期的帖子
  • lostechies.com/jimmybogard/2013/03/26/scaling-nservicebus-sagas
  • docs.particular.net/nservicebus/architecture/principles

也就是说你的saga应该没有业务逻辑,里面也没有if-else指令。它应该只是一个协调器,调用它应该是“面向成功的”——也就是说:在调用 Saga 之前应该尽可能多地进行验证。

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

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

湾。还是更好地“占用”处理程序,这样 NServiceBus “知道”该消息正在被大量使用,并可以相应地采取行动 - 即通过自动负载平衡,创建处理过程的另一个实例不同的工艺甚至不同的机器?

正确的方法是什么?

您能否提供一些示例代码以及您的答案,调用一个Foo.DoTimeConsumingBar()方法。

谢谢你。

4

2 回答 2

1

在 Saga 中,一切都应该简明扼要。

这种说法没有任何意义。你说的简洁是什么意思?你说的快是什么意思?saga 将在其运行的容器的约束内尽可能快地工作。

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

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

还是更好地“占用”处理程序,这样 NServiceBus “知道”该消息正在被大量使用,并且可以采取相应的措施 - 即自动负载平衡?

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

你应该尽你所能,这样 Saga 中就没有业务逻辑了.....你应该在 Saga 之前“以成功为导向”做尽可能多的验证,这样一旦你进入 Saga,你就会期待成功

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

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

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

我认为处理程序没有任何特殊需要快速完成。saga 的全部意义在于,如果它不被使用,它将脱水到磁盘,所以它不像 saga 正在等待占用内存,直到外部消息处理程序完成它们的工作。

关于您关于负载平衡的其他问题,我相信我的回答仍然基于我对问题的理解。

于 2015-12-18T11:02:14.907 回答
1

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

处理程序应该遵循SRP 单一职责原则,即使它们是 I/O 密集型的,它们仍然应该保持精简。在 I/O 密集型操作的情况下,分配器/负载平衡器将有助于扩展负载。

那有意义吗?

于 2016-03-19T11:33:01.783 回答