首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

Python 调用海外 API 超时排查实录:从 DNS 到出口 IP

最近在做一个项目,需要调用海外某 SaaS 服务的 REST API。本地开发环境测试一切正常,但部署到腾讯云的 Ubuntu 服务器后,接口开始频繁超时。超时不是必现,大概每 10 次请求会有 2-3 次失败,错误信息是 `requests.exceptions.ReadTimeout`。 排查了两天,最终定位到出口 IP 的问题。这篇文章把整个过程整理出来,包括排查思路、定位方法和解决方案。 ### 一、初步排查:不是 API 的问题 第一步先确认目标 API 本身是否正常。用 `curl` 带 `-w` 参数统计各阶段耗时: ``` curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \ "https://api.example.com/health" ``` 结果发现: - DNS 解析正常,10ms 左右 - TCP 连接正常,30ms 左右 - TLS 握手正常,80ms 左右 - TTFB 偶尔飙到 5s 以上,甚至直接超时 问题出在**服务端响应阶段**,不是本地网络连不上。 ### 二、深入排查:出口 IP 被限速了 用 `mtr` 跟踪到目标 API 的路由: ``` mtr -r -c 100 api.example.com ``` 发现中间节点有轻微丢包,但不严重。继续检查出口 IP 的“身份”。 用 `curl` 访问 IP 检测服务,查看当前出口 IP 的 ASN 归属: ``` curl -s https://ipinfo.io/json | jq '.org, .asn' ``` 结果显示:ASN 属于某云服务商,是典型的数据中心 IP 段。 很多海外 API 服务对数据中心 IP 有**速率限制或信誉降级**。原因是这些 IP 段常被用于爬虫、滥用和自动化攻击,服务商为了保障正常用户的体验,会主动对机房 IP 做限制。表现就是:能连上,但响应慢,偶尔直接超时。 这也解释了为什么本地开发环境(家用宽带)正常,而云服务器上频繁超时。 ### 三、验证:更换出口 IP 后恢复 为了验证这个判断,我将请求通过住宅 IP 出口发出。住宅 IP 的 ASN 归属于当地运营商,在 API 服务商的信誉体系中优先级更高,不会被当作机房流量限速。 配置方式如下: ``` # ============================================ # 使用住宅 IP 作为请求出口示例 # 住宅 IP 服务:1024Proxy # 官网:https://1024proxy.com/?kwd=hyj-txy # ============================================ import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 从服务商后台获取的代理信息 proxy_url = "http://用户名:密码@gateway.1024proxy.com:端口" # 创建 Session 并配置代理 session = requests.Session() session.proxies.update({ "http": proxy_url, "https": proxy_url }) # 配置重试机制 retry = Retry( total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504], allowed_methods=["GET", "POST"] ) adapter = HTTPAdapter(max_retries=retry) session.mount("http://", adapter) session.mount("https://", adapter) # 请求示例 try: response = session.get( "https://api.example.com/data", timeout=(5, 30) # 连接超时 5s,读取超时 30s ) print(response.json()) except requests.exceptions.Timeout: print("请求超时,重试或切换出口") ``` 切换到住宅 IP 后,同样的 API、同样的调用频率,超时率从 20% 降到接近 0。后续连续跑了一周,没有再出现批量超时。 ### 四、其他优化建议 **设置合理的超时时间**:连接超时和读取超时要分开设置。连接超时建议 3-5 秒,读取超时根据 API 的响应时间调整,一般 30 秒足够。 **加入指数退避重试**:偶发的网络抖动可以通过重试解决。`urllib3` 的 `Retry` 类支持退避策略,避免短时间内密集重试。 **监控出口 IP 的可用性**:定期用 `curl` 或 `ping` 检测出口 IP 的连通性,如果发现持续异常,及时切换。 **DNS 解析优化**:如果 DNS 解析慢,可以改用公共 DNS 或本地 hosts,减少解析阶段的耗时。 ### 五、小结 调用海外 API 频繁超时,不一定是代码问题,也不一定是目标服务宕机。**出口 IP 的类型**往往是容易被忽略的关键因素。数据中心 IP 在海外服务的信誉体系中天然处于劣势,更换为住宅 IP 出口通常能显著改善稳定性。 排查顺序建议:先测 DNS 和 TCP 连接,再看 TLS 和 TTFB,最后检查出口 IP 的 ASN 归属。如果确认是机房 IP 且目标服务有限速策略,切换到住宅 IP 是成本较低、见效较快的方案。 --- *本文仅做技术交流,请遵守相关平台规则与法律法规。*

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册