使用Orleans,如何用分布式数据存储实现分布式计算?

Using Orleans, how to implement distributed computation with distributed data storage?

我是分布式计算和orleans的新手,最近在研究这些,不知道orleans是否可以用于新任务。

这个任务是,有很多项目属于不同的人,每个项目都有很多数据。对于每个项目,步骤如下:

  1. 通过原始计算获取新数据data.Raw数据存储在分布式数据库中,然后新数据将存储回数据库。可以使用 MQ 或 Redis 来提高性能。
  2. 根据新数据计算汇总值并将汇总值保存回数据库。

我的问题是:

  1. Server/Grain 负载平衡: 没有唯一 ID 的 Grans。最好在所有服务器中运行多个grains来进行负载均衡,每个grains只是从数据库中获取数据并进行计算,不需要创建一个带有id的实例。对于奥尔良,除了无状态谷物之外,不允许没有唯一ID的谷物,而无状态谷物只是在本地运行。
  2. 长运行计算:计算和总结可能需要几秒或几分钟才能完成,是否推荐使用grains?好像不推荐文档。
  3. 顺序执行:需要先从原始数据中计算出新的值,然后再根据新值进行汇总。就是说summary的grains必须是运行在所有的grains for calculation都做完之后
  4. 数据缓存:Grains通过本地网络从数据库中获取数据并将数据保存到数据库中,对于orleans有减少数据传输的建议吗?
  1. Server/Grain 负载均衡: 无状态的 worker grains 很适合自动横向扩展。如前所述,调用将被路由到当前 silo 上的 grains(如果调用来自客户端,则路由到网关 silo)。对于 long-运行ning 任务,横向扩展实际上被限制为与 CPU 核心数量相匹配的颗粒数量。但是,听起来您 can/want 可以控制横向扩展。我建议使用 Guid.NewGuid() 路由到您自己的 "stateless" grains。或者,查看将工作发布到流中。流事件将由所有筒仓上的不同代理拉取并在集群中处理。
  2. Long 运行 Computation: 这取决于你的工作和代码的具体情况,但总的来说我认为Orleans "turns"不是一个好的适合长时间 运行ning 任务。 Orleans 执行模型为集群中的每个 CPU 核心提供一个线程。如果您的 Orleans 线程都被锁定到 long-运行ning grain 调用,则其他 grain 调用可能会开始 fail/timeout。您可以通过将长 运行ning 任务分成更小的块来解决该问题。或者,您可以在单独的线程中 运行 长时间 运行ning 任务(参见 External Tasks and Grains)。如果需要,请务必查看调整默认的 grain 调用超时。
  3. 顺序执行:您可以让从原始数据计算值的 grains 在作业完成时向计算摘要的 grain 发送通知。如果您的摘要 can/should 是增量计算的,则只需计算每个通知的摘要。但是,如果您需要等待所有作业完成,那么只需让计算摘要的 grain 跟踪哪些作业仍在等待。然后,只有在收到所有通知后才计算摘要。
  4. 数据缓存:你可以在grain实例变量中缓存数据。这通常会减少所需的数据库调用次数,因为后续的 grain 调用将在一段时间内路由到相同的激活(直到它空闲并停用)。