前景提要
我使用 tornado 做的一个 web api,里面没有数据库存储业务,主要业务是调用第三方 web api 接口。 刚开始时使用的是 requests 模块来做 http 请求,结果发现并发稍高一点的时候 nginx 里大量请求超时的日志,后来通过搜索相关资料,发现 tornado 需要使用异步 httpclient,踩了第一个坑。
后面将请求第三方接口全部替换成 AsyncHTTPClient 后,上述问题立马解决,并发能力大大提升,nginx 错误日志也没有了。 再后来根据业务需求,需要在请求第三方接口的时候使用 proxy,AsyncHTTPClient 不支持 proxy 设置,需要改用 CurlAsyncHTTPClient,按照官方文档修改好代码后,又出现了并发超时问题,将 CurlAsyncHTTPClient 改回 AsyncHTTPClient 问题就消失。
这张图是使用 AsyncHTTPClient 的时候,服务器运行情况,每个进程有多个子进程。
而当使用 CurlAsyncHTTPClient 或 requests 的时候,每个进程下面就只有一个子进程了,也就产生了并发瓶颈问题。 [官方文档提醒] 注意, 如果你正在使用 curl_httpclient, 强力建议你使用最新版本的 libcurl 和 pycurl. 当前 libcurl 能被支持的最小版本是 7.21.1, pycurl 能被支持的最小版本是 7.18.2. 强烈建议你所安装的 libcurl 是和异步 DNS 解析器 (threaded 或 c-ares) 一起构建的, 否则你可能会遇到各种请求超时的问题。*
按照文档要求,重新编译服务器 curl 。c-ares 也支持了,但还是无法解决问题。
以上就是问题的描述了,希望大佬能帮忙提供一下解决思路。