您的位置:首页 > 其它

服务调用效率比较

2016-07-09 17:38 351 查看
在一些较大规模的软件项目上,如果对用户体验要求较高,那就有必要对服务调用效率作个比较。

关于服务调用,无外乎有两种:本地调用(项目内)和远程调用(项目间)。

本地调用,在其他因素相同的情况下,由于不需要对外通信,其效率肯定最高。但问题是,随着业务的发展,当一台服务器无法满足时,我们必须远程调用。

远程通讯可能有很多,现比较一下,local,rabbitmq RPC ,WebAPI的效率。

环境是:本地电脑,满足硬件环境一致的要求;

分别启动 rabbitmq,WebAPI,使用同一算法,以保证所有的业务逻辑一致。为了最大限度的提高WebAPI的效率,不使用任何第三方框架。

如: 只实现Servlet接口

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String val = servletRequest.getParameter("num");
int fibVal = 0;
try {
fibVal = fib(Integer.valueOf(val));

} catch (Exception ex) {

}
servletResponse.setContentType("text/html");
servletResponse.setCharacterEncoding("utf-8");
PrintWriter writer = servletResponse.getWriter();
writer.println(fibVal);
writer.flush();
writer.close();

}
。
请求端如下:

public static void main(String[] args) throws Exception {
String message = readStrFromConsole();
long start = System.currentTimeMillis();
int localVAl = fib(Integer.valueOf(message));
System.out.println("local:first:" + (System.currentTimeMillis() - start));
System.out.println(message + "'s Fibo is " + localVAl);
start = System.currentTimeMillis();
RPCClient fiboRpc = new RPCClient();
String response = fiboRpc.call(message);
fiboRpc.close();
System.out.println("RPC:Second:" + (System.currentTimeMillis() - start));
System.out.println(message + "'s Fibo is " + response);
start = System.currentTimeMillis();
String http_response = RemoteRequest.Get("http://localhost:8080/TestWeb/test?num=" + message);
System.out.println("HTTP:Second:" + (System.currentTimeMillis() - start));

System.out.println(message + "'s Fibo is " + http_response);
}
计算fib(41)的值,测试结果如下:

Connected to the target VM, address: '127.0.0.1:55175', transport: 'socket'
41
local:first:1017
41's Fibo is 165580141
RPC:Second:1207
41's Fibo is 165580141
Disconnected from the target VM, address: '127.0.0.1:55175', transport: 'socket'
HTTP:Third:2106
41's Fibo is 165580141

第二次运行:

41
local:first:1017
41's Fibo is 165580141
RPC:Second:1227
41's Fibo is 165580141
HTTP:Third:1963
41's Fibo is 165580141

第三次:

41
local:first:1022
41's Fibo is 165580141
RPC:Second:1193
41's Fibo is 165580141
Disconnected from the target VM, address: '127.0.0.1:55203', transport: 'socket'
HTTP:Third:1969
41's Fibo is 165580141

。。。

经过更多次的调用,你会发现:

local , 在1000ms 左右;

rabbitmq RPC ,在 1200ms 左右;

WebAPI,在 2000ms 左右。

由此来看,在远程调用中,rabbitmq RPC的效率要比WebAPI高很多。

但有一点限制,rabbitmq RPC 只能用于同一网段,不过对于跨网段的还是可以解决的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: