标签:
在一些较大规模的软件项目上,如果对用户体验要求较高,那就有必要对服务调用效率作个比较。
关于服务调用,无外乎有两种:本地调用(项目内)和远程调用(项目间)。
本地调用,在其他因素相同的情况下,由于不需要对外通信,其效率肯定最高。但问题是,随着业务的发展,当一台服务器无法满足时,我们必须远程调用。
远程通讯可能有很多,现比较一下,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 只能用于同一网段,不过对于跨网段的还是可以解决的。
标签:
原文地址:http://www.cnblogs.com/itdev/p/5656274.html