如何在最短的时间内执行大量的HTTP请求

How to do a very large number of HTTP requests in shortest time

本文关键字:执行 请求 HTTP 时间      更新时间:2023-10-16

因此,我们有一个非常巨大的数据库,其中约有30万个URL。这些URL必须被刺穿并从中获取数据。(这些URL是正在播放歌曲的广播电台。数据是元数据)

其中一些有时是不活动的,有时是活跃的。在任何给定时间,大约有80,000个活动。有些反应缓慢,有些响应很快。我有一台服务器,我正在考虑使用C 这样做我的目标是在1分钟内ping和解析(或爬网),并继续重复该过程,因为信息(播放歌曲)可能会随着时间而变化。从2-7分钟到大多数。但是我不确定是否可能。我的方法应该是什么?我已经想到创建两个程序,一个是测试URL是否处于活动状态,每天运行两次。以及回应通常需要多少时间。它通常响应缓慢还是现在响应速度较慢。

,另一个要进行实际爬行,而最快的爬行将首先爬行,而响应速度更快的URL的一些专用线程。

请我更喜欢更好的想法或更好的解决方案。可以告诉我如何进行数学来找出我应该分配的专用线程数量,以在最小的时间内获得结果

您不需要CPU的性能(目前不是瓶颈),但是您需要避免网络层失速...如果请求超时为60秒,而您有16个线程,并击中16个非常缓慢的服务器(最终将超时),您通常会停滞60秒,而不会再处理任何内容。

所以我首先要说的是500个线程(如果您知道非常慢的无线电都可以适合此速度,则像15-30次暂停一样),并保持对其周转的统计数据,并继续动态添加更多的工作线程对于在2-3秒内未能得到响应的每个原件。80000/500 = 160,因此每个"通常快速"的工作线程都必须在160个URL大约160个URL上进行ping,如果每个URL确实需要2秒钟,那仍然是320 = 5分钟!因此,500听起来最小。

也就是说,拥有500多个线程会在某种程度上负担CPU和内存负担(不确定有多少,有多大的线程/内存模型实现500对于带有GB带有GB的RAM的现代X86 CPU听起来不大,甚至5000个声音仍然合理),但是我会更担心网络层以及周围可能的防火墙,您需要像网络这样的服务器级来获得此类请求(如果我尝试从家中尝试这样的东西,我自己的路由器会过滤我默认设置,将其检测为某种DOS攻击)。

因此,请获取一些统计信息平均需要多长时间,然后花费您的目标时间(2-7分钟),然后将URL数除以诸如平均ping 5s,循环时间3分钟= 300,000/(3*60)/5)= 8333.33螺纹至少需要。然后,您将必须配置您的应用程序以验证,使用8000个线程不会在其他方面扼杀,但它确实可以按预期处理任务。

(另一个选项是向单程启动异步HTTP请求,但是这种方式会以任何方式为每个任务创建其自己的线程,因此我宁愿自己管理线程,并使用同步HTTP调用)

和思考动态增长力学...您可以保留一些有关在最后一秒钟添加了多少新请求的计数器,以及有多少个完成(响应或失败),并且在运行几秒钟后,这些请求应开始形成某种"吞吐量"统计量,则如果吞吐量在所需的阈值之下,则可以添加更多线程。

关于活动/非活动...保持响应时间/最后一个看到/最后一个检查与URL一起检查,并仅在有意义的情况下添加一些逻辑以检查URL(例如,如果不在60年代,则仅在60年代,响应,或在上次测试后6小时检查不活动)。您还需要避免在两个不同的线程中检查相同的URL,因此某些中央管理器代码应以目标为目标(也许是某些FIFO线程安全队列...实际上您可以使用其大小来估计工作线程正在处理它,因此当您看到队列未足够快=时,您可以添加更多线程=避免将统计代码添加到线程中)。