调用淘宝接口有每IP数量/时间限制-负载均衡解决

其实标题不太准确,不过原理是一样。

这里要解决的问题是:调用淘宝接口有每IP数量/时间限制,但是我们的调用量较大,有可能超过这个限制,从而导致可能被淘宝屏蔽一小段时间。为了解决这个问题,我们需要用多个公网ip去掉接口。而实现这一点的最好地方就是在路由器这一级别。

简要做法如下:

1)做一台linux路由器,它负责接受内网对淘宝的调用请求,然后平均分发到多个公网接口。具体是两个步骤:a)使用iptables标记(FWMARK)数据包;b)然后根据这个标记匹配不同的策略路由来分发到不同网卡接口。

2)内部其他需要调用淘宝接口的机器把这台路由器设置为网关(或者至少是 到淘宝服务器的下一跳)。这样,对淘宝接口的请求都会发给上述路由器。

具体操作:

1)配置路由器:

路由器需要三块网卡,一块网卡连接内网(LAN),两块网卡连接外网(WAN1 和 WAN2 )。这里假设

LAN IP 为 192.168.10.9 , 接口是eth0

WAN1  223.5.20.22 eth1

WAN2 223.5.20.29 eth2

a) 标记数据包

iptables -A PREROUTING -t mangle -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 0x22
iptables -A PREROUTING -t mangle -m state --state new -m statistic --mode nth --every 2 --packet 1 -j CONNMARK --set-mark 0x29
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark

大致解释一下:

i) 第一行的意思是 每两个发起新连接的包中的一个 标记为 22(数字是任意的,这里是为了方便起见,设置为和接口ip相似)。

注意: 发起新连接 这一限制非常重要,因为如果没有这个限制的话会变成:每两个数据包中的一个标记为22,这意味着 同一个连接(会话)的多个数据包的源IP会在多个地址之间来回变动,导致无法与远端服务器正常通信。

ii) 第二行同上,每两个发起新连接的包中的一个 标记为29。

iii) 刚刚说过,只有发起新连接的数据包会被标记,后续的属于同一个连接的数据包也要标记成一样。这就是第三句的作用:它会查看每一个数据包是否属于一个相关的连接,如果是,查看该连接的mark,然后该mark标记这个数据包。

接下来是路由部分:

一般情况下,路由都是根据数据包的目的地址进行匹配分发。但是在这个例子中,需要根据数据包的标记进行匹配,这就需要用到另外一种路由:策略路由。

这里策略路由的最终目的是:把不同标记的包发到不同的网卡接口。

b) 配置策略路由

一般情况下,linux有三个默认路由表 local, main, default。可以使用命令查看:

[[email protected] xxx]# ip rule
0: from all lookup local 
32766: from all lookup main 
32767: from all lookup default

每行最前面的数字代表优先级,数字越小,优先级越高。from all代表 来自于任意地址, 也就是说不论数据包的源地址是多少, 都会 lookup (查找) 后面的表。直到找一条匹配的路由,然后路由过程结束。

所以,为了让不同的标记匹配不同的路由,需要创建两个新路由表:

echo 200 link22 >> /etc/iproute2/rt_tables
echo 201 link29 >> /etc/iproute2/rt_tables

注:link22, link29 名字是任意的

为两个路由表各添加一条普通路由:

ip route add default via 223.5.20.22 dev eth1 table link22
ip route add default via 223.5.20.29 dev eth2 table link29

然后,添加两条策略路由:

ip rule add fwmark 0x22 table link22
ip rule add fwmark 0x29 table link29

至此,路由部分就完成了。

注:要使得上述策略路由生效,还有一个重要参数必须设置:reverse path filtering (反向路径过滤)。系统默认设置为1,需要把相关接口的该参数设置为0。

echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

c) 源地址转换

我们的这台linux机器是作为内部网络的网关路由器来使用的,所以,还需要在路由器上做一个源地址路由:把数据包中内网机器的IP替换成其出站网卡接口的IP地址。这样才能正确收到响应。

iptables -A POSTROUTING -t nat -o eth1 -j SNAT --to-source 223.5.20.22
iptables -A POSTROUTING -t nat -o eth2 -j SNAT --to-source 223.5.20.29

2) 在内网机器上配置网关

route add -net 0.0.0.0/0 gw 192.168.10.9

注:192.168.10.9 是路由器的内网地址。

时间: 2024-12-11 10:16:07

调用淘宝接口有每IP数量/时间限制-负载均衡解决的相关文章

淘宝接口实现ip归属地查询

<?php header('content-type:text/html;charset=utf-8'); /*获取当前ip归属地 调用淘宝接口 */ function get_ip_place($ip){ $jsonip=file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip); return $jsonip; } /*获取客户端ip*/ function getip() { if(geten

通过淘宝接口获取淘宝全部商品目录实例

最近项目需要,要获取淘宝商品全部类目结构,有两种方法,1. 可以通过爬虫技术实现, 2. 通过淘宝开放接口实现. 这里选用第2种方法,以下是实现过程: 1. 首先要申请成为淘宝开发者 http://open.taobao.com/index.htm 2. 进入后台后,新建一个应用,得到一个app证书,证书里面有Appkey 和 Appsecret (Appsecret为 API 调用的密钥要注意保密,如泄漏要及时重置) 3. 调用淘宝接口还需要一个 sissionid,通过以下方式得到, 访问U

java调用淘宝api

代码下载地址:http://www.zuidaima.com/share/1550463234034688.htm 原文:java调用淘宝api java代码结构: java调用淘宝api,布布扣,bubuko.com

调用淘宝订单接口想到的一个问题

在淘宝提供的SDK中,并没有对接口调用返回结果进行安全性验证. 这样就存在一种可能,比如我的订单接口调用在网络传输过程中被劫持了(hacker伪造了格式一样的返回信息),那么就可能导致我的订单系统会引入一些实际上并没有在淘宝平台存在的订单,此时,如果订单系统的客服人员没有比对两个平台的订单的话,订单系统上多出的伪造的订单就可能被发货出去. 解决办法: 淘宝订单接口可以在接口返回的信息中,返回签名,然后sdk中对接口返回信息中的签名进行验证即可

Delphi使用JSON解析调用淘宝IP地址库REST API 示例

淘宝IP地址库:http://ip.taobao.com,里面有REST API 说明. Delphi XE 调试通过,关键代码如下: [delphi] view plaincopy var IdHTTP: TIdHTTP; RequestURL: string; ResponseStream: TStringStream; JO, JData: TJSONObject; begin IdHTTP := TIdHTTP.Create(nil); IdHTTP.ReadTimeout := 0;

淘宝购买的“公网IP盒子”企业版存在很多问题

现在罗列了几点问题希望官方尽快能得到解决 1:不支持PPPoE拨号(必须让路由器先拨号后再用这个设备上网)2:不支持双线双IP接入3:配置界面不能设置密码(知道内网IP就可以进了)4:不能代理独立IP(就是不能科学上网)5:香港IP经常会连续3至6个请求超时(断网20秒左右)6:HTTP访问的80端口被做了反向代理(PHP无法取得访问者真实IP地址) 使用香港IP的时候会有持续6个请求超时现象 在PHP代码里如果通过$_SERVER['REMOTE_ADDR']取得的IP永远都是10.10.12

淘宝十年技术路

最近有幸,在学校的图书馆借到了子柳先生的<淘宝技术这十年>,拜读一番,感慨万分.将书中内容加上自己的想法与诸君分享,毕竟未经人事看法粗浅,希望能得到园子里前辈们的指点~ 一.淘宝的核心技术(国内乃至国际的Top,这还是2011年的数据) 拥有全国最大的分布式Hadoop集群(云梯,2000左右节点,24000核CPU,48000GB内存,40PB存储容量) 全国分布80+CDN节点,能够自动找寻最近的节点提供服务,支持流量超过800Gbps,足以拖垮一个城市的流量 不逊于百度的搜索引擎,对数十

『淘宝十年技术路』读后想法

最近借到了子柳先生的<淘宝技术这十年>,拜读一番,感慨万分.将书中内容加上自己的想法说说,毕竟未经人事看法粗浅,希望能得到前辈们的指点. 一.淘宝的核心技术(国内乃至国际的Top,这还是2011年的数据) 拥有全国最大的分布式Hadoop集群(云梯,2000左右节点,24000核CPU,48000GB内存,40PB存储容量) 全国分布80+CDN节点,能够自动找寻最近的节点提供服务,支持流量超过800Gbps,足以拖垮一个城市的流量 不逊于百度的搜索引擎,对数十亿商品进行搜索,全球最大的电商平

2019淘宝:OceanBase分布式系统负载均衡案例分享

摘要:Heroku的问题让我们意识到,在负载均衡测试时发现问题并妥善解决的成功经验有没有?于是,挖掘出"淘宝在双十一压测OB时发现存在严重的随机访问导致负载不均问题,并通过加权算法妥善解决"的成功案例,也就是本文. 在CSDN云计算频道日前所做的文章<响应高达6秒 用户揭露Heroku私自修改路由造成高支出>中,网友们认为这是"因随机调度+Rails的单线程处理导致延迟增加的负载均衡失败的案例".但在负载均衡测试时就能发现问题并妥善解决的成功经验有没有?