是否有比RMI更快的Java二进制协议?

时间:2013-03-30 15:19:50

标签: java networking rmi netty binary-data

RMI是二进制网络协议的王者(速度方面),还是有更高基准速度的其他人?

是否可以使用像Netty这样的东西来构建我自己的二进制(TCP)协议,它会更快?我是网络新手,并试图围绕可用的各种库和框架。 Thansk提前!

3 个答案:

答案 0 :(得分:1)

RMI需要处理元数据并使用反射。如果您实现基于TCP和DataOutputStream / DataInputStream的自定义协议,它可能比RMI更快。

假设我们有一个RMI服务

 Service srv = (Service) Naming.lookup(lookupString);
 srv.sayHi("Jack");
 srv.sayBye("Back");

我们可以直接通过TCP连接发送命令和参数

 ObjectOutputStream out = ...
 out.write(0);  // 0 - Hi command 
 out.writeUTF("Jack");
 out.write(1);  // 1 - Bye command
 out.writeUTF("Jack");

答案 1 :(得分:1)

Protocal Buffers是串行化java对象最紧凑的方法之一。

根据您的需要,您可以将其与您自己的传输协议(原始tcp套接字,udp,http ..)结合使用。

答案 2 :(得分:1)

RMI的速度由两件事决定:

  1. 默认Java序列化
  2. 分布式垃圾收集
  3. 默认的Java序列化可能会令人惊讶地膨胀。通过实现Externalizale并执行自己的简单序列化,可以使对象序列化更轻量级。这已经开始看起来像做自定义协议。

    如果您的系统变大并包含许多JVM,分布式垃圾收集可能会成为一个因素。 DGC涉及JVM交换消息,相互警告有关垃圾收集的对象。它可能会产生大量的网络流量。

    也就是说,RMI“开箱即用”可能比其他“开箱即用”替代品更快。例如,SOAP在线路上的效率要低得多,并且涉及比RMI更深,更重的网络堆栈。

    您可以构建比RMI更快的自定义RPC,但如果依赖于Java序列化,由于上面的第1点,它可能不会快得多。

    最后,为什么要更快的协议?你有RMI速度的问题吗?您是否希望提前选择最快的“开箱即用”解决方案?请注意The rules of Optimize Club