猎鹰 API CPU 密集型任务
Falcon API CPU intensive tasks
我正在尝试使用 Falcon 构建 REST API。我将有一个 post
端点,我将收到一个 json (有时有数百个密钥),我将尝试处理此数据:
- 清理文本数据
- 从 str 转换为 int 或类似操作
- 3 次呼叫其他 APIs
- 插入 mysql 和 elastic
负载小于 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 秒的请求根本没有机会完成。
我正在尝试使用 Falcon 构建 REST API。我将有一个 post
端点,我将收到一个 json (有时有数百个密钥),我将尝试处理此数据:
- 清理文本数据
- 从 str 转换为 int 或类似操作
- 3 次呼叫其他 APIs
- 插入 mysql 和 elastic
负载小于 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 秒的请求根本没有机会完成。