gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:37:35 24 4
gpt4 key购买 nike

我对分布式计算和orleans还不熟悉,最近对这些进行了一些研究,不确定orleans是否可以用于新任务。

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

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

我的问题是:

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

最佳答案

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

关于.net - 使用Orleans,如何实现分布式计算和分布式数据存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com