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

时间:2019-02-25 15:32:49

标签: .net distributed computation orleans

我是分布式计算和奥尔良的新手,最近对它们进行了一些研究,不确定是否可以将奥尔良用于新任务。

此任务是,有许多项目属于不同的人,并且每个项目都有大量数据。对于每个项目,步骤如下:

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

我的问题是:

  1. 没有唯一ID的谷物。最好在所有服务器中运行多个粒度以实现负载平衡,每个粒度仅从数据库获取数据并进行计算,而无需创建具有id的实例。对于奥尔良,不允许使用无唯一ID的谷物(无状态谷物除外),而无状态谷物仅在本地运行。
  2. 长期运行计算。计算和摘要可能需要几秒钟或几分钟才能完成工作,是否建议使用谷物?似乎不建议在文档中使用。
  3. 顺序执行。有必要先根据原始数据计算新值,然后根据新值进行汇总。这意味着要汇总的谷物必须在所有要计算的谷物完成后再运行。
  4. 谷物从局域网中获取数据并将数据保存到数据库中,对于奥尔良是否有减少数据传输的建议?

1 个答案:

答案 0 :(得分:1)

  1. 无状态工人谷物可以很好地进行自动横向扩展。如前所述,这些呼叫将被路由到当前筒仓上的谷物(如果呼叫来自客户端,则路由到网关筒仓)。对于长时间运行的任务,横向扩展实际上限于与CPU内核数量匹配的数量。但是,听起来您可以/想要控制横向扩展。我建议使用Guid.NewGuid()路由到您自己的“无状态”谷物。或者,查看将工作发布到流。流事件将由所有孤岛上的不同代理拉出,并在整个集群中进行处理。
  2. 这取决于您的工作和代码的细节,但是总的来说,我认为奥尔良的“转弯”不适合长时间运行的任务。 Orleans执行模型为集群中的每个CPU内核提供了一个线程。如果您的奥尔良线程都被锁定在长时间运行的谷物调用上,则其他谷物调用可能开始失败/超时。您可以通过将长时间运行的任务分解为较小的块来解决此问题。另外,您可以在单独的线程中运行长时间运行的任务(请参见External Tasks and Grains)。如果需要,请务必考虑调整默认的晶粒调用超时。
  3. 您可以让根据原始数据计算值的谷物在作业完成时向计算摘要的谷物发送通知。如果您的摘要可以/应该递增计算,则只需在每个通知中计算摘要即可。但是,如果您需要等待所有作业完成,则只需简单地计算摘要即可跟踪仍未完成的工作。然后,仅在收到所有通知后才计算摘要。
  4. 您可以将数据缓存在谷物实例变量中。这通常会减少所需的数据库调用次数,因为随后的谷物调用将在一段时间内路由到同一激活(直到它变为空闲并停用)。