鉴于来自流的一系列URL,其中数百万可能是bit.ly,google或tinyurl缩短链接,解决这些问题以获得最终网址的最具扩展性的方法是什么?
多线程抓取工具在每个短链接上执行HEAD请求,同时缓存已经解决的链接?有没有提供此服务的服务?
还要考虑不阻止网址缩短服务。 假设规模是每天2000万缩短的网址。
答案 0 :(得分:6)
Google provides an API。 bit.ly也是如此(并且bit.ly要求通知大量使用,并指明它们对光的使用意味着什么)。我不知道tinyurl(用于解码)的适当API,但可能有一个。
然后,您必须按每秒230个网址的顺序获取,以跟上所需的费率。我将测量每个服务的典型延迟,并根据需要创建一个主actor和多个worker actor,这样actor就可以阻止查找。 (我会使用Akka,而不是默认的Scala actor,并确保每个worker actor都有自己的线程!)
您还应该在本地缓存答案;查找已知答案比查询这些服务要快得多。 (主演员应该照顾好。)
在那之后,如果由于网站的限制而仍然无法跟上,你最好先与网站交谈,否则你将不得不做一些相当可疑的事情(租一堆不同站点的廉价服务器,并向他们提出请求。)
答案 1 :(得分:2)
使用HEAD方法是一个有趣的想法,我担心它会失败,因为我不确定你提到的服务是否支持HEAD。例如,如果服务是作为java servlet实现的,那么它只能实现doGet()。在这种情况下,doHead()不受支持。
我建议你尝试使用GET,但不要阅读整个回复。仅读取HTTP状态行。
如果您对性能有非常严格的要求,则不能同步这些请求,即您不能使用HttpUrlConnection。您应该直接使用NIO包。在这种情况下,您将能够仅使用一个线程向所有数百万个目的地发送请求,并且可以非常快速地获得响应。