【问题标题】:Very Large Number of Web Calls from Java Code来自 Java 代码的大量 Web 调用
【发布时间】:2014-10-02 22:10:41
【问题描述】:

我正在用 Java 编写一个程序,该程序必须对同一服务器上的各个页面进行大约 650 万次调用(通过附加将从文本文件中读取的用户名,URL 将略有改变).. 首先我想知道这样做最省时的方法,其次,任何人都可以猜测这可能会消耗多少时间?目前我正在阅读 ExecutorService 对象的单独线程中的每个 url .. 类似这样的

ExecutorService executor = Executors.newFixedThreadPool(10);
Runnable worker = new MyRunnable(allUsers[n]);
executor.execute(worker);

run 方法如下所示:

is = url.openStream();  // throws an IOException
br = new BufferedReader(new InputStreamReader(is));


while ((line = br.readLine()) != null) {
    page = page + line;

    // More code follows

}

任何建议都将受到高度赞赏

【问题讨论】:

  • 批量/批量请求?
  • 谁能猜猜:5小时? 6天? 2分钟?猜测没有任何意义。衡量而不是猜测。
  • 好的,如果有人测量了处理这么多电话的情况,请分享
  • 这是您拥有的服务器吗?确保成为一个好公民并遵守 robots.txt 并注意不要被列入黑名单。你也可以设置一个集群。
  • @MZAmin:你应该意识到我的服务器的性能,使用我选择的技术,在我的网络和硬件上,以及执行我的业务逻辑,与你的服务器的性能无关,在您的硬件和网络上运行您的逻辑。如果您的服务器计算生命的意义并在每次请求时发回 5 MB 的数据,在 Pentium 2 上,在 4kbits/sec 网络上,它显然会比在千兆网络上计算 1 和 1 的和慢得多和一个由 8 台 16 核机器组成的集群。

标签: java multithreading url volumes


【解决方案1】:
  • 不,没有人能猜到这会消耗多少“时间”。我们不知道服务器完成请求需要一毫秒还是一小时。

  • 最有效的方法是使用更高效的 API,允许批量请求。

  • 在 10 个线程时,您的程序可能会受到 IO 限制。您将需要分析确保充分使用 CPU 所需的线程数。您可以使用 Java 7 特性/NIO 框架(如 Netty 或 MINA)来避免这种情况,因此一个线程可以同时处理多个请求。 (我不确定这些是否是客户端)。

【讨论】:

  • OP 正在使用的固定线程池使用固定大小的线程池来执行许多任务。 OP 的代码只使用了 10 个线程,每个线程按顺序处理请求。
【解决方案2】:

我同意其他 cmets 的看法,并回答说无法预测这需要多长时间,并且“批量传输”请求很可能会提供更好的性能。

还有几点:

  • 如果您可以使用返回 JSON 或 XML 而不是网页的 RESTful API ... 那会更快。

  • 在客户端,如果您要获取的文档很大,这将非常有效:

        while ((line = br.readLine()) != null) {
            page = page + line;
        }
    

    这将进行过多的复制。更好的方法是:

        StringBuilder sb = new StringBuilder(...);
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        page = sb.toString();
    

    如果您可以很好地估计页面大小,则创建那么大的StringBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多