出站负载均衡器

1 投票
3 回答
1396 浏览
提问于 2025-04-15 16:34

我有一个用Python写的脚本,用来获取很多线程的内容。

我想问的是,怎么才能让我的请求在发送的时候更均匀,不要总是去请求同一个主机呢?

这个问题对feedburner来说很重要,因为很多网站会通过feedburner来处理他们的RSS,而更复杂的是,很多网站会把他们的子域名设置成指向feedburner,这样就让人看不出来他们在用feedburner(比如“我的网站”把它的RSS地址设置成feeds.mysite.com/mysite,而feeds.mysite.com实际上是指向feedburner)。有时候,这样会导致我被暂时封锁,还会被重定向到他们的“自动请求”错误页面

3 个回答

1

"我该如何平衡发出的请求,以免频繁访问同一个主机?"

通常,你可以通过设计一个更好的算法来解决这个问题。

比如,可以随机打乱你的请求顺序。

或者公平地洗牌,让请求轮流发送到不同的主机。这样的话,可以简单地把请求放在一个队列里,从每个主机中取出一个请求来处理。

2

如果你遇到的问题和Feedburner有关,特别是它对你的请求进行限制,那很可能是因为你的机器的IP地址。要想“平衡负载到Feedburner”,最好的办法就是使用多个不同的IP地址来发送请求。

实现这个目标的方法有很多,下面列出两种:

  1. 多网卡服务器:在同一台机器上使用多个IP地址
  2. 多台独立的机器

当然,别在它们前面放个NAT盒子哦;-)


以上方法可以解决可能的“限制问题”,接下来是“调度部分”。你应该为每个“目标”维护一个“虚拟调度器”,确保不要超过所使用的网络服务(比如Feedburner)的参数限制。现在,棘手的部分是要弄清楚这些“限制”... 有时候这些限制会被公开说明,有时候你需要通过实验来找出来。

我知道这些只是“高层次的架构指导”,但我还没准备好为你写代码... 希望你能理解;-)

3

你可能需要每周或每月做一次请求,具体看你需要什么。对于每个信息源(feed),你要跟踪重定向,以获取“真实”的地址。无论你当时的请求限制是什么,你都应该能够解析所有的信息源,保存这些数据,然后每当你添加新的信息源时,只需做一次请求。你可以看看urllib的geturl(),它会返回你输入的URL的最终地址。当你访问这些信息源时,确保使用原始地址(保留“真实”的地址是为了负载均衡),这样可以确保如果用户移动了地址,重定向能正常工作。

完成这些后,你可以简单地设计一个负载机制,比如每小时对某个域名只发X个请求,逐个处理每个信息源,跳过那些已经达到请求限制的主机。如果feedburner公开了他们的限制(这不太可能),你可以用这个作为X的值,否则你就得自己估算,确保你的估算值低于限制。不过,考虑到谷歌的情况,他们的限制可能会根据使用模式来衡量,而不是设定一个具体的硬性限制。

编辑:根据评论添加了建议。

撰写回答