如何在最短的时间内完成大量的HTTP请求

时间:2017-09-22 05:25:52

标签: c++ http

所以我们有一个非常庞大的数据库,有大约300,000个网址。这些网址必须被ping并从中获取数据。(这些网址是播放歌曲的广播电台。数据是元数据)

其中一些有时是不活跃的,有时是活跃的。 在任何给定时间,大约80,000活跃。有些反应缓慢,有些反应很快。我有一台服务器,我想用c ++来做这件事 我的目标是在1分钟内ping并解析(或爬行)它们并继续重复该过程,因为信息(播放它们的歌曲)可能会随着时间的推移而改变。主要是2-7分钟。但我不确定是否有可能。 我的做法应该是什么? 我想过要创建两个程序,一个用于测试url是否处于活动状态,并且每天运行两次。通常需要多长时间才能做出回应。它通常是响应缓慢还是现在响应较慢。

另一个是进行实际抓取,其中最快将被抓取,而一些专用线程用于响应速度更快的网址。

请相信我会有更好的想法或更好的解决方案。任何人都可以告诉我如何进行数学计算,找出我应该分配给每个专用线程的数量,以便在最短的时间内获得结果

1 个答案:

答案 0 :(得分:0)

您不需要CPU的性能(此时不是您的瓶颈),但您需要避免网络层停滞...如果请求超时为60秒,并且您有16个线程,并且命中16个非常慢的服务器(最终会超时),你通常会停顿60秒而不再处理任何事情。

所以我首先要讲500个线程(如果你知道非常慢的无线电能够适应这种情况,就像15-30秒超时一样),并保持一些有关其周转的统计数据,并继续添加为每个在2-3秒内没有得到响应的原始动态动态创建更多工作线程。 80000/500 = 160,所以每个"通常很快"工作者线程然后ping 160个网址,如果每个确实需要2秒,那么仍然是320 = 5分钟!所以500听起来像是最小的。

也就是说,拥有500多个线程会对CPU和内存产生一定的负担(不确定多少,对于具有GB RAM,甚至5000个声音的现代x86 CPU而言,正常的线程/内存模型实现500听起来并不多仍然合理),但我会更担心网络层和周围可能的防火墙,你需要服务器级网络这样的请求(如果我会尝试从我家里这样的东西,我自己的路由器将过滤我out with default settings,将其检测为某种DoS攻击。)

所以得到一些统计数据请求平均需要多长时间,然后记录你的目标时间(2-7分钟),并将网址数除以那些,如平均ping 5s,圆周时间3min = 300,000 /(3 * 60) / 5)=至少需要8333.33个线程。然后你将需要分析你的应用程序以验证,使用8000个线程它不会阻塞其他东西,但它将真正按预期处理任务。

(其他选项是从单个线程激发异步http请求,但是这种方式为每个任务创建自己的线程,所以我宁愿自己管理线程,并使用同步http调用)

考虑动态增长机制......你可以保留一些计数器,说明在最后一秒添加了多少新请求,以及完成了多少(响应或失败),并且在运行几秒后应该开始形成某种"吞吐量"统计,然后如果吞吐量低于期望的阈值,则可以添加更多线程。

关于活动/非活动...将响应时间/最后查看/最后检查与url一起保存,并添加一些其他逻辑以仅在有意义时检查URL(如不是在未来60年内,如果它只是在上次测试后6小时后回复或检查不活动)。您还需要避免同时在两个不同的线程中检查相同的URL,因此一些中央管理器代码应该为目标提供线程(可能是一些FIFO线程安全队列...实际上您可以使用它的大小来估计工作线程正在处理它,所以你可以在看到队列没有足够快地清空时添加更多线程=这样可以避免添加统计代码来自己进行线程化。)