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

Rya*_*hou 3 .net distributed computation orleans

我对分布式计算和orleans很陌生,最近对那些\xef\xbc\x8进行了一些研究,不确定orleans是否可以用于新任务。

\n\n

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

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

我的问题是:

\n\n
    \n
  1. 服务器/Grain 负载平衡:没有唯一 ID 的 Grans。最好在所有服务器上运行多个grain以实现负载平衡,每个grain只是从数据库获取数据并进行计算,不需要创建带有id的实例。对于Orleans来说,除了无状态的Grain之外,不允许有没有唯一id的Grain,无状态的Grain只在本地运行。
  2. \n
  3. 长时间运行计算:计算和总结可能需要几秒钟或几分钟才能完成工作,是否建议使用grains\xef\xbc\x9f,似乎文档中不建议使用。
  4. \n
  5. 顺序执行:需要先根据原始数据计算出新值,然后根据新值进行汇总。这意味着用于汇总的grain必须在所有用于计算的grain完成之后才运行。
  6. \n
  7. 数据缓存: Grains通过本地网络从数据库获取数据并将数据保存到数据库,对于orleans是否有减少数据传输的建议\xef\xbc\x9f
  8. \n
\n

sen*_*ico 5

  1. 服务器/Grain 负载平衡: 无状态 Worker Grain 非常适合自动横向扩展。如前所述,呼叫将被路由到当前筒仓上的grains(如果呼叫源自客户端,则路由到网关筒仓)。对于长时间运行的任务,横向扩展实际上仅限于与 CPU 核心数量相匹配的粒度。但是,听起来您可以/想要控制横向扩展。我建议使用 路由到您自己的“无状态”grains Guid.NewGuid()。或者,查看将工作发布到流。流事件将由所有孤岛上的不同代理拉取并在集群中进行处理。
  2. 长时间运行计算: 这取决于您的工作和代码的具体情况,但总的来说,我认为奥尔良“轮流”不太适合长时间运行的任务。Orleans 执行模型为集群中的每个 CPU 核心提供一个线程。如果您的 Orleans 线程全部锁定到长时间运行的 Grain 调用,其他 Grain 调用可能会开始失败/超时。您可以通过将长时间运行的任务分解为更小的块来解决这个问题。或者,您可以在单独的线程中运行长时间运行的任务(请参阅外部任务和 Grains)。如果需要,请务必考虑调整默认的grain调用超时。
  3. 顺序执行: 您可以让根据原始数据计算值的grain 在作业完成时向计算摘要的grain 发送通知。如果您的摘要可以/应该增量计算,则只需计算每个通知的摘要即可。但是,如果您需要等待所有作业完成,那么只需让计算摘要的粒度跟踪哪些作业仍待处理即可。然后,仅在收到所有通知后才计算摘要。
  4. 数据缓存: 您可以将数据缓存在grain实例变量中。这通常会减少所需的数据库调用数量,因为后续的grain调用将在一段时间内路由到相同的激活(直到它空闲并停用)。