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