快速休息呼叫执行

时间:2014-09-27 19:55:11

标签: java performance web-services rest bulk

这个问题有两个部分

第1部分

我需要为第三方API进行批量Rest API调用,即每小时300K ,因此优化代码以及时获取/管理响应的最佳方法是什么。在测试中,我尝试生成1000个Threads并调用下面的代码以在最短时间内获得响应,但结果非常令人失望。一些调用成功响应,但许多调用返回超时错误。

        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet("http://www.example.com");

        HttpResponse response;
        response = client.execute(httpGet);
        System.out.println(response.getStatusLine().getStatusCode());
        HttpEntity entity = response.getEntity();
        String result = getStringFromInputStream(entity.getContent());

我知道超时错误可能是由服务器端引起的,但是例如服务器返回响应并且我的所有1000个线程在5分钟内响应,那么我仍然无法达到每小时300k的呼叫。其次,我可以用其他方式优化此代码吗?

第2部分

我用Java试过这个,我很想知道如果我使用java以外的语言会得到更好的结果吗?即javascript / python / PHP?

更新1

我的测试系统规格

  • Ubuntu 14.04 64位
  • 4Gb RAM
  • 500 GB硬盘
  • 英特尔®酷睿™i5-2430M CPU @ 2.40GHz×4
  • 互联网连接= 1 MB :(

更新2

我的服务器规格在未来/实际中进行测试

  • Cent OS 6.5
  • 1 GB RAM
  • 1 CPU Core
  • 40 Gbit Network In
  • 125 Mbit Network Out:)

请指导。谢谢。

3 个答案:

答案 0 :(得分:1)

我只会尝试回答你问题的第1部分

您正在获取超时(或者可能是连接被拒绝的异常),因为您正在为您创建的每个HttpClient实例打开一个新套接字,并且您的操作系统将创建的套接字数量有限制。如果你在linux上运行,你可能会注意到你将有数百个处于CLOSE_WAIT状态的套接字,只有在VM的垃圾回收运行时才会关闭。

尝试像这样创建一个httpClient实例,并且每次要进行http调用时都不要创建新的httpclient实例。

    ClientConnectionManager mgt = new ThreadSafeClientConnManager();
    DefaultHttpClient httpClient = new DefaultHttpClient(mgt);

答案 1 :(得分:0)

要使用python每小时达到300k请求,我建议使用Celery之类的东西。您可以轻松地在Y服务器上生成X进程+一个将每小时添加300k任务的调度程序。

我使用Celery和RabbitMQ进行网站性能测试,使用2-3台服务器,我很快就能在几分钟内发送20k请求。

答案 2 :(得分:0)

Apache HTTPCommons 4.3 Fluent API为我提供了诀窍,我能够提供比上述更多的请求。