我正在测试Microsoft Orleans作为分布式计算框架的可行性。似乎可行,但是我想知道如何在给定的筒仓中设置最大活动颗粒数?
我的谷物将不完全受CPU约束,将执行一些IO和其他相关任务。我担心,如果我放任不管,它会旋转大量实例,使整个过程陷入瘫痪。
像这样的筒仓配置可以吗?
奥尔良非常适合非CPU限制的工作。奥尔良谷物被设计为使用Task<T>
进行异步,而不是使用线程,因此您应始终使用C#的[async / await] [1]功能执行异步IO。
如果绝对需要执行阻塞IO,则可以在grain上下文之外执行IO,并在grain中执行await
结果,如下所示:
var result = await Task.Run(() => {
// Perform blocking work.
return 43;
});
最好将所有阻塞操作卸载到线程池,并将MaxActiveThreads保留为默认值(#cores)。基本上,您永远不想阻塞Orleans线程(那些MaxActiveThreads)。那些奥尔良线程应该进行轻量级计算,并发出外部异步调用(对其他谷物或外部服务)。所有繁重的计算都不应在Orlean的线程上进行。
您可以执行此操作,并且仍然保持单线程执行保证。看到这里:http://dotnet.github.io/orleans/Advanced-Concepts/External-Tasks-and-Grains