我使用 tornado 做的一个 web api,里面没有数据库存储业务,主要业务是调用第三方 web api 接口。 刚开始时使用的是 requests 模块来做 http 请求,结果发现并发稍高一点的时候 nginx 里大量请求超时的日志,后来通过搜索相关资料,发现 tornado 需要使用异步 httpclient,踩了第一个坑。
后面将请求第三方接口全部替换成 AsyncHTTPClient 后,上述问题立马解决,并发能力大大提升,nginx 错误日志也没有了。 再后来根据业务需求,需要在请求第三方接口的时候使用 proxy,AsyncHTTPClient 不支持 proxy 设置,需要改用 CurlAsyncHTTPClient,按照官方文档修改好代码后,又出现了并发超时问题,将 CurlAsyncHTTPClient 改回 AsyncHTTPClient 问题就消失。
这张图是使用 AsyncHTTPClient 的时候,服务器运行情况,每个进程有多个子进程。
而当使用 CurlAsyncHTTPClient 或 requests 的时候,每个进程下面就只有一个子进程了,也就产生了并发瓶颈问题。
按照文档要求,重新编译服务器 curl 。c-ares 也支持了,但还是无法解决问题。
以上就是问题的描述了,希望大佬能帮忙提供一下解决思路。
1
TypeError 2020-06-29 13:22:58 +08:00 via Android
换 HTTPX
如果是 Python2 那就麻烦了, 或者可以试试 threadpoolexecutor |
2
TypeError 2020-06-29 13:25:31 +08:00 via Android
ThreadPoolExecutor + Requests 也能异步请求,效率可能比 httpx 低一点
|
3
Vegetable 2020-06-29 13:30:15 +08:00
python2 下,为了减少代码变动,可以在本地搭建一个中转服务,中转服务使用 httpx 这种支持代理的异步网络库去请求第三方。
|
4
iawavij OP 感谢两位大佬指点,忘记说了,项目是 py3,proxy 使用的是 socks5,考虑过 httpx,查看文档暂不 socks 类型 proxy 。
|
5
676529483 2020-06-29 13:53:22 +08:00
tornado 的异步客户端我也用过,感觉不好用,最后换了 aiohttp
|
6
syrupofplum 2020-06-29 13:56:52 +08:00
socks5 代理都没发现有原生支持,要么用第三方库辅助支持,要么自己做一些协议转换吧。
|
7
iawavij OP 目前使用 run_in_executor 运行 requests 先顶着
本机测试 CurlAsyncHTTPClient 比 AsyncHTTPClient 和 requests 效率都高很多,应该还是服务器 curl 编译的问题 |