【问题标题】:How does Prefect scale with thousands of workflows concurrently?Prefect 如何同时扩展数千个工作流?
【发布时间】:2023-03-18 01:13:01
【问题描述】:

我有一个在本地运行的完美服务器(0.13 核心版本)。我在具有 64 GB RAM 和 32 个 CPU 核心的服务器机器上循环调用 flow.run() 100 万次。当它运行到大约 300 次时,它开始从 GraphQL 抛出连接拒绝错误。

我仍在考虑是否在我的工作流程中使用 Prefect,但它看起来占用了太多 RAM。 Prefect 如何同时扩展数千个工作流?

我用一个简单的例子来运行工作流:

176 from flask import Flask
177 app = Flask(__name__)
178
179 import prefect
180 client = prefect.Client()
181
182 @app.route('/')
183 def hello_world():
184     client.create_flow_run("032275d0-6c31-4dc5-bf32-5b2afadbe531")
185     return 'Hello, World!'

然后我调用 REST API 来触发从 1 到 1000 的流。

for i in {1..1000}; do curl localhost:5000/; done

我了解到 GraphQL 正在使用大量内存(最多 10 GB RAM)。然后 Prefect UI 开始徘徊在 100 左右。

我不确定我是否将 Prefect 工作流程用作其预期用途,但如果可能的话,我想解决这个问题。

【问题讨论】:

  • 还评估了某些工作流程的 Prefect。我不确定,但看看数据库模式,我可能是错的,但它似乎并不容易扩展。系统将日志、流运行状态、任务运行状态都保存在同一个数据库中。据我了解,UI 连接到 Apollo,Apollo 连接到处理所有突变和东西的 GraphQL 客户端。 GraphQL 使用 Hasura 与 Postgres 进行交互。
  • 所以我可以想象大量的请求会使事情变慢。我想也许你可以解决 Postgres 的一些瓶颈,并使用 NoSQL 数据库来加快速度。但奇怪的是他们会重写数据库逻辑的相关方面,不知道......
  • @LifeAndHope 有多少代理在处理这 1000 个流?您是否在服务器上运行单个代理?您的流程的计算密集程度如何?在生产环境中,服务器只是处理调度,代理(复数)将水平运行您的流程。

标签: prefect


【解决方案1】:

开源 Prefect Server 并不是为这种规模而设计的;正如in this new doc 所述,这是人们迁移到专为规模和性能而设计的 Prefect Cloud 的原因之一。

【讨论】:

  • 但是他们在这里正确使用 Prefect 吗?限制仅仅是因为服务器性能范围还是他们可以更有效地配置任务?
  • 是的,当然——如果他们有一个工作流,他们需要运行/编排通过调用此 /hello 路由触发,这是有效的,并且在这种规模下也有效(尽管通常运行 1k单一环境中的流导致 CPU / 进程 / 等的资源争用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多