【问题标题】:What are performant, scalable ways to resolve links from http://bit.ly [closed]什么是从 http://bit.ly 解析链接的高性能、可扩展的方法 [关闭]
【发布时间】:2011-10-17 14:39:44
【问题描述】:

鉴于流中的一系列 URL,其中数百万可能是 bit.ly、google 或 tinyurl 缩短链接,解决这些链接以获得最终 URL 的最具可扩展性的方法是什么?

多线程爬虫对每个短链接执行 HEAD 请求,同时缓存您已经解析的链接?是否有已经提供此功能的服务?

还要考虑不被网址缩短服务阻止。 假设规模为每天 2000 万个短网址。

【问题讨论】:

  • 例如,bit.ly 有一个 API 可以帮助您,但我不确定他们是否会完全乐意每天为您提供 2000 万个请求。
  • 可能你应该为此使用异步 IO 或至少选择器,否则你最终会遇到 CPU/线程的瓶颈。

标签: java performance scala scalability


【解决方案1】:

谷歌provides an APIbit.ly 也是如此(并且 bit.ly 要求通知重度使用,并指定轻量使用的含义)。我不知道 tinyurl(用于解码)的适当 API,但可能有一个。

然后您必须以每秒 230 个 URL 的顺序获取,以跟上您想要的速率。我会测量每个服务的典型延迟,并根据需要创建一个主角色和尽可能多的工作角色,以便角色可以阻止查找。 (我会为此使用 Akka,而不是默认的 Scala 演员,并确保每个工人演员都有自己的线程!)

您还应该在本地缓存答案;查找已知答案比向这些服务询问答案要快得多。 (主要演员应该注意这一点。)

在那之后,如果您仍然无法跟上,例如,被网站限制,您最好要么与网站交谈,否则您将不得不做一些相当有问题的事情(租一堆不同站点的廉价服务器并将请求分流给它们)。

【讨论】:

  • 很酷,bit.ly 有 API (+1)。但他也必须支持其他服务。你需要 1000 个线程才能每秒获取 230 个 URL。
  • @AlexR - 每次查找 4 秒?这有点慢。没有一个网站需要那么长时间来进行重定向。无论如何,即使他确实需要 1000 个线程,那也不是问题; JVM 可以毫不费力地支持这么多。不过,使用 NIO 会更优雅(但可能更难编码)。
【解决方案2】:

使用 HEAD 方法是一个有趣的想法,我担心它会失败,因为我不确定你提到的服务是否支持 HEAD。例如,如果服务实现为 java servlet,则它只能实现 doGet()。在这种情况下,不支持 doHead()。

我建议您尝试使用 GET 但不要阅读整个响应。仅读取 HTTP 状态行。

只要您对性能有非常严格的要求,您就不能同步这些请求,即您不能使用 HttpUrlConnection。您应该直接使用 NIO 包。在这种情况下,您将能够仅使用一个线程向所有数百万个目的地发送请求,并非常快速地获得响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2012-03-14
    • 2011-08-09
    • 2010-09-09
    • 1970-01-01
    • 2011-01-24
    • 2021-10-18
    • 2013-06-19
    相关资源
    最近更新 更多