[为clairty编辑]
我不确定我是否正确理解。
根据这些指导性的帖子,在佐贺的内部,一切都应该简洁明快:
也就是说你的传奇应该没有业务逻辑,内部没有if-else指令。它应该只是一个协调者,调用它应该被计划为“成功导向” - 即:在尽可能多地调用Saga之前应该尽可能多地进行验证。
但是那些单独的处理程序(你称之为“独立处理程序”吗?),那些不属于传奇的处理程序?以下哪项对他们来说是正确的:
一个。声明外部的NServiceBus消息处理程序是否总是快速完成,并且如果有一个耗时的操作传递给一个线程并完成?
湾或者更好地“占用”处理程序,并且NServiceBus“知道”此消息正在使用繁重的收费,并且可以相应地采取行动 - 即使用自动负载平衡,创建处理过程的另一个实例一个不同的过程甚至不同的机器?
什么是正确的方法?
您可以提供一些示例代码以及您的答案,并调用Foo.DoTimeConsumingBar()
方法。
谢谢。
答案 0 :(得分:1)
在佐贺里面,一切都应该简明扼要。
这句话没有任何意义。简洁是什么意思?你快点是什么意思?传奇将在其运行的容器的范围内尽可能快地工作。
saga外部的NServiceBus消息处理程序是否始终完成 很快,如果有一个耗时的动作传递给a 线程并完成?
除非您以这种方式构建了处理程序,否则不行。如果您的消息处理过程非常耗时,则除了将处理消息的处理程序实例之外,没有其他进程。
或者#34; hog"处理程序,以及那种NServiceBus "知道"这条消息的使用费用很高,而且可以 相应地采取行动 - 即自动负载平衡?
运行多线程时,可以使用多个hander实例来处理消息。每个处理程序实例仍然只处理单个消息,但这可以同时发生。因为有一个单一的消息源,即输入队列,所以它提供了负载平衡"你需要的行为。
你应该尽你所能,这样就没有生意 佐贺内部的逻辑.....你应该成功导向'尽可能多地做 在佐贺之前尽可能验证,以便一旦进入佐贺 你期待成功
是的,sagas应该只关注长期运行过程的编排,而不是它的细节。
鉴于上述情况,我会修改我对你原来的一个问题的回答:
saga外部的NServiceBus消息处理程序是否始终完成 很快,如果有一个耗时的动作传递给a 线程并完成?
我认为处理程序没有特别需要快速完成。传奇的全部意义在于,如果它没有被使用,它将脱水到磁盘,所以它不像是在外部消息处理程序完成工作之前,传奇等待占用内存。
关于负载均衡的另一个问题,我相信我的答案仍然基于我对这个问题的理解。
答案 1 :(得分:1)
@pashute,你关于Sagas的陈述是正确的,应该没有工作(I / O),应该作为长期业务流程的编舞者。
处理程序应该遵循SRP Single Responsibility Principle,即使它们是I / O密集型的,它仍然应该保持精简。在I / O密集型操作的情况下,分配器/负载平衡器将有助于扩展负载。
这有意义吗?