我有一个WSGI应用程序(它是一个Flask应用程序,但我觉得这应该是无关紧要的)在一个Gunicorn服务器端口9077下运行。该应用程序有一个/ status端点,它应该报告&# 39; OK'如果应用程序正在运行如果它无法在合理的时间内报告OK,整个容器将被杀死(由Kubernetes)。
问题在于:当应用程序负载很重(偶尔会发生)时,/ status端点可能需要一段时间才能响应,容器有时会过早被杀死。有没有办法配置Gunicorn始终在单独的线程中提供/ status端点?也许甚至在不同的港口?我很感激处理这种情况的任何提示或想法。
答案 0 :(得分:1)
从未与Gunicorn合作,我不确定它是否支持此功能。
但是对于uWSGI,当我知道应用程序将处于沉重负载时,
我用uwsgi
运行--processes
(也可以在多线程模式下运行,或两者都运行)
uWSGI只是旋转了烧瓶应用程序的多个实例并充当负载均衡器,不需要不同的端口,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次/秒 希望有所帮助。
ps:另一种解决方案,只需启动运行应用程序的更多容器
并将它们置于nginx
后面以进行负载平衡