在单独的线程中提供 WSGI 应用端点?
Serving a WSGI app endpoint in a separate thread?
我有一个 WSGI 应用程序(它是一个 Flask 应用程序,但我认为这应该是无关紧要的)运行 在端口 9077 的 Gunicorn 服务器下。该应用程序有一个 /status 端点,它应该如果应用是 运行,则报告 'OK'。如果它未能在合理时间内报告 OK,则整个容器将被杀死(由 Kubernetes)。
问题是这样的:当应用程序负载非常重时(偶尔会发生),/status 端点可能需要一段时间才能响应,并且容器有时会过早终止。有没有办法将 Gunicorn 配置为始终在单独的线程中为 /status 端点提供服务?也许甚至在不同的端口?对于处理这种情况的任何提示或想法,我将不胜感激。
从未使用过 Gunicorn,我不确定它是否支持此功能。
但是 uWSGI,当我知道应用程序将承受沉重的负载时,
i 运行 uwsgi
和 --processes
(也可以 运行 在多线程模式下或两者)
uWSGI 只是启动 flask 应用程序的多个实例并充当负载均衡器,不需要不同的端口,uwsgi
会处理所有事情。
您不再受 GIL
的约束,您的应用程序使用机器上的所有可用资源。
documentation about uWSGI concurrency
a quick tutorial on how to setup a flask app, uWSGI and nginx(nginx部分可以跳过)
这是我提供的配置文件的示例。
[uwsgi]
module = WSGI:app
master = true
processes = 16
die-on-term = true
socket = 0.0.0.0:8808
protocol = http
uwsgi --daemonize --ini my_uwsgi_conf.ini
我可以很容易地达到 1000 calls/sec 当它 运行 那样。
希望帮助ps.
ps:另一种解决方案,只需启动更多正在 运行 应用程序的容器。
并将它们放在 nginx
后面以平衡负载
我有一个 WSGI 应用程序(它是一个 Flask 应用程序,但我认为这应该是无关紧要的)运行 在端口 9077 的 Gunicorn 服务器下。该应用程序有一个 /status 端点,它应该如果应用是 运行,则报告 'OK'。如果它未能在合理时间内报告 OK,则整个容器将被杀死(由 Kubernetes)。
问题是这样的:当应用程序负载非常重时(偶尔会发生),/status 端点可能需要一段时间才能响应,并且容器有时会过早终止。有没有办法将 Gunicorn 配置为始终在单独的线程中为 /status 端点提供服务?也许甚至在不同的端口?对于处理这种情况的任何提示或想法,我将不胜感激。
从未使用过 Gunicorn,我不确定它是否支持此功能。
但是 uWSGI,当我知道应用程序将承受沉重的负载时,
i 运行 uwsgi
和 --processes
(也可以 运行 在多线程模式下或两者)
uWSGI 只是启动 flask 应用程序的多个实例并充当负载均衡器,不需要不同的端口,uwsgi
会处理所有事情。
您不再受 GIL
的约束,您的应用程序使用机器上的所有可用资源。
documentation about uWSGI concurrency
a quick tutorial on how to setup a flask app, uWSGI and nginx(nginx部分可以跳过)
这是我提供的配置文件的示例。
[uwsgi]
module = WSGI:app
master = true
processes = 16
die-on-term = true
socket = 0.0.0.0:8808
protocol = http
uwsgi --daemonize --ini my_uwsgi_conf.ini
我可以很容易地达到 1000 calls/sec 当它 运行 那样。
希望帮助ps.
ps:另一种解决方案,只需启动更多正在 运行 应用程序的容器。
并将它们放在 nginx
后面以平衡负载