cdn业务涉及不少网络问题,而国内的网络环境又很复杂,因此常常会出现不少业务中出现下载特别慢的问题, 对客户资源的注入影响很严重,轻则致使任务大量超时,堆积,重则会出现业务不能在规定时间内完成。因此通常会用各类方法探测链路的好坏, 探测合适的带宽和并发。其中有个容易忽略的就是去拉取资源的时候的链路选择。html
该文章后续仍在不断的更新修改中, 请移步到原文地址http://dmwan.ccpython
通常拉取客户的资源,客户都会提供一个或者两个ip,电信或者移动。比较通常的作法,假如用python实现的话,有的人会使用requests 库,或者使用curl , 或者使用wget。bash
这三种方法的区别是什么?第一种通常不会用,为何?由于requests http解析使用的urllib库,是py实现,大量注入,大量http协议解析,会打高cpu,此外,使用requests ,绑定ip,使用自定义运营商ip去获取资源,是至关麻烦的一件事,可是也能够实现,经过在socket层封装也可行。curl 是使用libcrul 底层实现,c实现的协议解析,一个特色就是快,使用libcurl 也能够指定公网出口ip 。 使用wget和curl 均可以使用指定出口ip。服务器
首先,咱们不指定出口会出现什么现象?不指定出口。不少三线服务器就会受路由表影响,使用下面命令
能够查出出口ip 会使用哪一个interface:网络
ip route get to to_ip
三线机器都会设置不少路由规则,不指定就走这些,那若是指定bind ip ,哪一个优先级大?bind ip大!并发
如今通用的作法是客户ip是什么线,咱们这就使用 isp 的ip去 wget bind-address 去取,可是这样没问题? 同样会有问题。问题就在解析域名上,若是恰巧客户提供多 isp 的ip ,而你的路由表设置不当, 就会致使下载很慢!curl
举个例子。客户源站的域名提供两个 A 记录,分别是电信和联通,而你的本地路由表到dns 服务器 的路由表恰巧设置走的路由是电信的,你本地 wget bind-address 使用的ip 是联通的,那会什么问题?dns 解析域名,会返回一个客户的电信ip 给你,而后你用你联通的ip 去跟对方建联, 而后,你就悲剧了!socket
有什么方法,避免这个问题?给个连接url
wget 官方1.8 后修复了这个问题,提供了个参数,你能够bind ip 去访问dns 。而后就可用控制访问源站两边的isp线路了。固然,你也能够直接不写域名,直接上ip。 code