论坛首页 Java企业应用论坛

支持多序列化的RPC框架——avro-rpc性能测试

浏览 16186 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-16  
首先感谢lz的分享

然后最好能再细点,就是serialize,deserialize时间和序列化后文件大小都能做下对比

不同条件的服务器会有不同方面的考量
0 请登录后投票
   发表时间:2012-10-16  
跟这个是什么关系?
http://coderplay.iteye.com/blog/419907
0 请登录后投票
   发表时间:2012-10-16  
Json序列化反序列化都比avro快?
0 请登录后投票
   发表时间:2012-10-16  
helloqiner 写道
Json序列化反序列化都比avro快?

这里Json用的阿里开源的FastJson,FastJson在性能方面做过很多优化,所以其性能确实比较好。FastJson序列化反序列化都比avro快,应该也不是绝对的,不同的测试数据,可能会有不同的结果,我这里这是测试只是用了一个比较简单的POJO对象
0 请登录后投票
   发表时间:2012-10-16  
runshine 写道
跟这个是什么关系?
http://coderplay.iteye.com/blog/419907


Avro 是一个数据序列化框架。
avro_rpc 是一个RPC框架,其中使用了avro的序列化,当然还支持其他多种序列化方式
0 请登录后投票
   发表时间:2012-10-17   最后修改:2012-10-17
invokeSync 和invokeAsync 这样调用不够人性化,可以考虑创建代理对象的方式。对于异步方式,考虑使用注解方式,异步返回结果对象类型为Future<?>


public class RpcClientInvocationHandler implements InvocationHandler {
	
	private IClient client;

	public RpcClientInvocationHandler(IClient client) {
		this.client = client;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		String beanName = proxy.getClass().getInterfaces()[0].getName();
		String methodName = method.getName();
		
		Object result = client.invokeSync(beanName, methodName, method.getParameterTypes(),
				args, method.getReturnType(),
				SerializerFactory.SERIALIZER_JSON);
		
		return result;
	}

}

public class RpcClientProxyFactory {
	
	@SuppressWarnings("unchecked")
	public <T> T create(Class<T> serviceInterface, String address, int port) throws IOException {
		ITransceiver transceiver = new NettyTransceiver();
		IClient client = new RPCClient("localhost", 7001, transceiver);
		
		return (T)Proxy.newProxyInstance(
				RpcClientProxyFactory.class.getClassLoader(),
                new Class<?>[] { serviceInterface },
                new RpcClientInvocationHandler(client));
	}

}


客户端可以增加几个特性:
1:创建多个连接访问服务端,增加并发处理能力。
2:连接超时设置。

0 请登录后投票
   发表时间:2012-10-18   最后修改:2012-10-18
melin 写道
invokeSync 和invokeAsync 这样调用不够人性化,可以考虑创建代理对象的方式。对于异步方式,考虑使用注解方式,异步返回结果对象类型为Future<?>


public class RpcClientInvocationHandler implements InvocationHandler {
	
	private IClient client;

	public RpcClientInvocationHandler(IClient client) {
		this.client = client;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		String beanName = proxy.getClass().getInterfaces()[0].getName();
		String methodName = method.getName();
		
		Object result = client.invokeSync(beanName, methodName, method.getParameterTypes(),
				args, method.getReturnType(),
				SerializerFactory.SERIALIZER_JSON);
		
		return result;
	}

}

public class RpcClientProxyFactory {
	
	@SuppressWarnings("unchecked")
	public <T> T create(Class<T> serviceInterface, String address, int port) throws IOException {
		ITransceiver transceiver = new NettyTransceiver();
		IClient client = new RPCClient("localhost", 7001, transceiver);
		
		return (T)Proxy.newProxyInstance(
				RpcClientProxyFactory.class.getClassLoader(),
                new Class<?>[] { serviceInterface },
                new RpcClientInvocationHandler(client));
	}

}


客户端可以增加几个特性:
1:创建多个连接访问服务端,增加并发处理能力。
2:连接超时设置。


感谢 melin的建议。如果是同步调用,使用代理确实使用上方便简单。如果是异步调用,我觉得还是用回调方式处理性能更好,如果用Future,还是需要阻塞一个获取结果的线程,这样就失去使用异步提高并发处理能力的目的了

关于同一个客户端需要多个连接访问服务端,没必要。因为连接是可以复用的,每个方法调用都带有个int类型的标识号。

连接超时与调用超时,有一个全局的设置。如果需要针对每个方法设置调用超时时间,需要稍微修改下
0 请登录后投票
   发表时间:2012-10-19  
做了一个简单的测试,调用10000次服务,没有spring rmi快!
同一台机器上测试,
0 请登录后投票
   发表时间:2012-10-23  
melin 写道
做了一个简单的测试,调用10000次服务,没有spring rmi快!
同一台机器上测试,

RMI依靠Java序列化机制,而java序列化性能吞吐量并不高,楼上吧测试方法说详细点
0 请登录后投票
   发表时间:2012-11-23   最后修改:2012-11-23
请问一下: 我运行代码里面的 TestClient.java  , 运行之后 程序没有关闭,多运行几次就多打开几个连接 (调用完了能关闭客户端连接不), 如果要用在系统当中的话 ,是不是需要对 TestClient做处理,不能每次调用都 new一个 TestClient对象吧,   太弱了,整不明白!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics