这个问题有两个部分
我需要为第三方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的呼叫。其次,我可以用其他方式优化此代码吗?
我用Java试过这个,我很想知道如果我使用java以外的语言会得到更好的结果吗?即javascript / python / PHP?
我的测试系统规格
我的服务器规格在未来/实际中进行测试
请指导。谢谢。
答案 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为我提供了诀窍,我能够提供比上述更多的请求。