【问题标题】:Using Orleans, how to implement distributed computation with distributed data storage?使用Orleans,如何实现分布式数据存储的分布式计算?
【发布时间】:2019-07-19 01:26:37
【问题描述】:

我是分布式计算和orleans的新手,最近做了一些研究,不确定orleans是否可以用于新任务。

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

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

我的问题是:

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

【问题讨论】:

    标签: .net distributed computation orleans


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

    【讨论】:

    • 感谢您的详细解释!对于问题1,对于来自客户端的调用,无状态工作者颗粒的数量是由网关silo的数量决定的,对吧?因此它无法在集群中使用更多计算机进行横向扩展。我不熟悉流,如果使用流,土壤会产生尽可能多的谷物以获得出色的性能吗?对于问题2,IMO如果使用外部并且时间长于呼叫超时,没有办法动态延迟超时,这将导致呼叫失败。是否有其他框架可供我进行集群计算?
    • 1.对于客户端请求,我不熟悉决定将 StatelessWorker 请求发送到哪个网关的具体逻辑。有趣的是,我们看到这些谷物出现在我们所有的筒仓中。对我们来说,在实践中,向集群添加更多的孤岛/机器会增加 StatelessWorker 激活的最大数量。 (也许在这里添加更多 StatelessWorker 信息的请求?github.com/dotnet/orleans/issues/4400)如果真的需要,我会去Guid.NewGuid 路线。
    • 一般来说,奥尔良可以很好地编排您的场景。我们的应用程序中有大型的级联进程,而大数字运算只是在奥尔良“外部”运行。不过,StackOverflow cmets 并不是讨论这些设计模式的好方法。我会推荐一个关于特定设计模式的新的、特定的问题。或者,如果它更具探索性,可以在 Gitter 中聊天:gitter.im/dotnet/orleans
    • 是的,在stackoverflow中评论很粗糙。感谢您的帮助
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多