【问题标题】:Serving a WSGI app endpoint in a separate thread?在单独的线程中提供 WSGI 应用程序端点?
【发布时间】:2016-10-25 08:45:31
【问题描述】:

我有一个 WSGI 应用程序(它是一个 Flask 应用程序,但我认为这应该无关紧要)在 Gunicorn 服务器的端口 9077 下运行。该应用程序有一个 /status 端点,如果应用程序正在运行。如果它未能在合理的时间内报告 OK,则整个容器将被杀死(由 Kubernetes)。

问题是这样的:当应用程序负载非常重时(偶尔会发生),/status 端点可能需要一段时间才能响应,并且容器有时会过早终止。有没有办法将 Gunicorn 配置为始终在单独的线程中提供 /status 端点?也许甚至在不同的港口?我将不胜感激处理这种情况的任何提示或想法。

【问题讨论】:

    标签: python networking flask wsgi gunicorn


    【解决方案1】:

    从未与 Gunicorn 合作过,我不确定它是否支持此功能。

    但是使用uWSGI,当我知道应用程序将承受重负载时,
    我用--processes 运行uwsgi(也可以在多线程模式下运行或两者都运行)

    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 后面进行负载平衡

    【讨论】:

    • 这个 uWSGI 解决方案看起来很棒,谢谢!澄清一下,你真的在​​ prod 中运行普通的 uwsgi,前面没有 nginx 吗?
    • @JordanDimov uWSGI 已准备好生产(并且比 Gunicorn 更成熟)。 nginx 只是增加了更多的灵活性,例如重定向、反向代理、标头内容、ssl 等...如果您不需要高级功能,只需使用uWSGI 就足够了。如果有帮助,请考虑接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2012-03-31
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多