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

2021-01-24 13:13:18 +08:00
 PPTX

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

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

请求用的 requests

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

3503 次点击
所在节点    Python
18 条回复
chroming
2021-01-24 13:38:24 +08:00
主要耗时在代理等 B 的过程?用了 gunicorn+nginx 么?
chenqh
2021-01-24 13:47:16 +08:00
改用 tornado 吧?
wuwukai007
2021-01-24 14:20:27 +08:00
fastapi 或者 django3.1 吧
viiii
2021-01-24 14:50:13 +08:00
有高并发需求, 直接无脑 fastapi
BeanYoung
2021-01-24 14:53:02 +08:00
这场景适合用 openresty,没有比这个性能更好的了应该
plko345
2021-01-24 15:05:14 +08:00
@BeanYoung 这不是 nginx 吗?
itdog888
2021-01-24 15:10:21 +08:00
@BeanYoung 这个和 nginx 有什么分别
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
2021-01-24 16:55:35 +08:00
@plko345 因为对数据还有一定的处理,所以不能直接用 nginx,目前用了 nginx 反向代理了。
Vegetable
2021-01-24 17:00:52 +08:00
fastapi+httpx,采用协程方案,对代码改动最小。长得和 flask+requests 差不多,性能基本就是 python 天花板了。
LeeReamond
2021-01-24 17:22:14 +08:00
py 的高并发的话肯定是要上 io 复用的,flask 怎么部署都不行。fastapi 我没测试过,aiohttp 的话可以上 uvloop+prefork 部署,单机可用性能达到几万 qps,很可以了
laminux29
2021-01-24 18:28:42 +08:00
Python 的优势在于超高的开发效率,如果一定要追求运行性能,建议考虑一下 C++,或者把 Python 耗性能的部分改成 C++实现或 C++中间件。
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
2021-01-25 13:59:35 +08:00
@PPTX openresty 是最好的选择了,数据处理什么的不是问题,openresty+lua 你查库写业务逻辑都没问题
PPTX
2021-01-25 15:23:01 +08:00
@abersheeran
@sadfQED2
目前的代理消息走向:客户端 A --> 我的代理 --> 服务端 B 。
我的代理收到 A 的请求后,会等待请求 B 得到回复后,再把内容回复给 A 。

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

重点是异步网络请求。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747840

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX