在一些较大规模的软件项目上,如果对用户体验要求较高,那就有必要对服务调用效率作个比较。
关于服务调用,无外乎有两种:本地调用(项目内)和远程调用(项目间)。
本地调用,在其他因素相同的情况下,由于不需要对外通信,其效率肯定最高。但问题是,随着业务的发展,当一台服务器无法满足时,我们必须远程调用。
远程通讯可能有很多,现比较一下,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'
41local:first:101741's Fibo is 165580141RPC:Second:120741's Fibo is 165580141Disconnected from the target VM, address: '127.0.0.1:55175', transport: 'socket'HTTP:Third:210641's Fibo is 165580141第二次运行:
41
local:first:101741's Fibo is 165580141RPC:Second:122741's Fibo is 165580141HTTP:Third:196341's Fibo is 165580141第三次:
41
local:first:102241's Fibo is 165580141RPC:Second:119341's Fibo is 165580141Disconnected from the target VM, address: '127.0.0.1:55203', transport: 'socket'HTTP:Third:196941's Fibo is 165580141。。。
经过更多次的调用,你会发现:
local , 在1000ms 左右;
rabbitmq RPC ,在 1200ms 左右;
WebAPI,在 2000ms 左右。
由此来看,在远程调用中,rabbitmq RPC的效率要比WebAPI高很多。
但有一点限制,rabbitmq RPC 只能用于同一网段,不过对于跨网段的还是可以解决的。