猎鹰 API CPU 密集型任务

Falcon API CPU intensive tasks

我正在尝试使用 Falcon 构建 REST API。我将有一个 post 端点,我将收到一个 json (有时有数百个密钥),我将尝试处理此数据:

负载小于 50 requests/second 但我的请求可能需要几分钟才能处理,因为键的数量和对其他 API 的调用(一个请求可以触发 100 x 3 api 调用和相同数量的插入数据库/弹性)

鉴于这些情况,falcon 未能解决我的大部分请求。我正在使用 gunicorn 为应用程序提供服务,也尝试使用 serve.forever 提供服务。我试过使用 gevent 但没有成功。

我必须提到该服务在 docker 中运行。

我是否遗漏了 falcon 中的任何缩放设置,或者这是我的设计缺陷?

澄清一下,缩放通常由应用程序服务器控制;作为一个 WSGI/ASGI 应用程序框架,Falcon 提供了一个可调用的应用程序,它根据 WSGI(或 ASGI)协议规范呈现对提供的请求的响应。因此,Falcon 本身没有缩放设置。

您需要确定您的服务是 CPU 绑定还是 I/O 绑定(另请参阅:What do the terms "CPU bound" and "I/O bound" mean?)。如果它确实是 CPU 绑定,您可能需要为您的服务器添加更多处理能力。如果 I/O 绑定(等待其他 API 和数据库),您也许可以解决并行等待 I/O 的问题:

  • 运行 大量工作进程
  • 运行每个进程的线程数更多
  • 运行大量并行greenlets/Gevent核
  • 运行大量并行asyncio协程(使用ASGI)

请注意,大量的进程和线程可能会产生相当大的调度开销。此外,由于 GIL (What is the global interpreter lock (GIL) in CPython?).

,线程在 Python 中会产生额外的性能损失

诸如Gevent and asyncio的异步事件循环通常在大规模并行I/O时表现更好;但是,您需要确保您的 I/O(例如 API 和 DB)调用与所选的异步技术兼容。

另一件需要注意的事情是跨应用服务器、负载平衡器、反向代理等的超时设置。例如,Gunicorn 的 default worker timeout is 30 seconds,这意味着,如果使用默认的 sync worker class, 超过 30 秒的请求根本没有机会完成。