V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
PPTX
V2EX  ›  Python

Python flask 实现 http 消息代理服务,怎么配置高并发?

  •  
  •   PPTX · 2021-01-24 13:13:18 +08:00 · 3483 次点击
    这是一个创建于 1181 天前的主题,其中的信息可能已经有所发展或是发生改变。

    flask 实现一个 http 消息代理服务,即 客户端 A -> 代理 -> 服务器 B 。 目前方案:

    1. 代理 收到 A 的请求消息。
    2. 代理 将请求消息稍微处理,然后把请求发送给 B 。
    3. 代理 收到 B 的回复消息。
    4. 代理 将回复消息稍微处理,发给 A 回复。

    请求用的 requests

    目前是代理收到 A 的请求后,会等待代理请求 B 得到回复后,再把内容回复给 A 。会有等待。测试发现该方式高并发性能比较差,需要哪些优化处理?

    18 条回复    2021-01-25 18:23:16 +08:00
    chroming
        1
    chroming  
       2021-01-24 13:38:24 +08:00 via iPhone
    主要耗时在代理等 B 的过程?用了 gunicorn+nginx 么?
    chenqh
        2
    chenqh  
       2021-01-24 13:47:16 +08:00
    改用 tornado 吧?
    wuwukai007
        3
    wuwukai007  
       2021-01-24 14:20:27 +08:00
    fastapi 或者 django3.1 吧
    viiii
        4
    viiii  
       2021-01-24 14:50:13 +08:00
    有高并发需求, 直接无脑 fastapi
    BeanYoung
        5
    BeanYoung  
       2021-01-24 14:53:02 +08:00 via iPhone
    这场景适合用 openresty,没有比这个性能更好的了应该
    plko345
        6
    plko345  
       2021-01-24 15:05:14 +08:00 via Android
    @BeanYoung 这不是 nginx 吗?
    itdog888
        7
    itdog888  
       2021-01-24 15:10:21 +08:00 via iPhone
    @BeanYoung 这个和 nginx 有什么分别
    leir
        8
    leir  
       2021-01-24 15:46:34 +08:00
    @plko345 @itdog888 楼主的需求用 nginx+Lua 写转发规则,改协议字段,性能最好,工作量最小
    nginx wiki 中推荐使用 openresty

    HTTP Lua Embed the power of Lua into NGINX HTTP servers (OpenResty Official)
    PPTX
        9
    PPTX  
    OP
       2021-01-24 16:55:35 +08:00 via iPad
    @plko345 因为对数据还有一定的处理,所以不能直接用 nginx,目前用了 nginx 反向代理了。
    Vegetable
        10
    Vegetable  
       2021-01-24 17:00:52 +08:00
    fastapi+httpx,采用协程方案,对代码改动最小。长得和 flask+requests 差不多,性能基本就是 python 天花板了。
    LeeReamond
        11
    LeeReamond  
       2021-01-24 17:22:14 +08:00 via Android
    py 的高并发的话肯定是要上 io 复用的,flask 怎么部署都不行。fastapi 我没测试过,aiohttp 的话可以上 uvloop+prefork 部署,单机可用性能达到几万 qps,很可以了
    laminux29
        12
    laminux29  
       2021-01-24 18:28:42 +08:00
    Python 的优势在于超高的开发效率,如果一定要追求运行性能,建议考虑一下 C++,或者把 Python 耗性能的部分改成 C++实现或 C++中间件。
    abersheeran
        13
    abersheeran  
       2021-01-25 10:13:34 +08:00
    flask 、requests 这两个库,跟高并发这个词一点关系都没有……

    你这个需求也别用 fastapi,他那个依赖注入一上,性能哗啦啦往下滑。倒不是说依赖注入不好用,关键你这个需求用不上。 @Vegetable 天花板就省省吧……它是天花板,那我写个玩意,性能是它 1.5 倍,岂不是把楼炸了?

    楼上说的对,如果你会用 openresty,这个是最好的。如果执意用 Python,推荐 bottle/pyramid 。真正的 Python web 框架性能天花板。https://github.com/the-benchmarker/web-frameworks 以防有人说我信口开河,性能测试排名在此。

    然后请求部分,如果你上了我说的两个框架之一,requests/httpx 随便挑一个就好了。有栈协程一开,都可以的。
    sadfQED2
        14
    sadfQED2  
       2021-01-25 13:59:35 +08:00 via Android
    @PPTX openresty 是最好的选择了,数据处理什么的不是问题,openresty+lua 你查库写业务逻辑都没问题
    PPTX
        15
    PPTX  
    OP
       2021-01-25 15:23:01 +08:00
    @abersheeran
    @sadfQED2
    目前的代理消息走向:客户端 A --> 我的代理 --> 服务端 B 。
    我的代理收到 A 的请求后,会等待请求 B 得到回复后,再把内容回复给 A 。

    我的代理 在收到 客户端 A 的请求后,会访问 redis,找出请求 url 到服务端 url 的映射,也就是每条请求消息,服务端的 url 可能都是不同的,存在 redis 里。这个场景,用 openresty + lua 能实现吗? 感谢
    abersheeran
        16
    abersheeran  
       2021-01-25 16:07:31 +08:00
    @PPTX 可以。Lua 操作 redis 呗,有现成的库。
    PPTX
        17
    PPTX  
    OP
       2021-01-25 17:37:08 +08:00
    @abersheeran 多谢
    hushao
        18
    hushao  
       2021-01-25 18:23:16 +08:00
    tornado/aiohttp/starlette/django3 + httpx 异步请求,asgi 方式部署,其中 httpx 和 requests 的用法兼容。flask 本身就算了,确实跟并发不一条路。

    重点是异步网络请求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5554 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:07 · PVG 14:07 · LAX 23:07 · JFK 02:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.