3

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

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

4

3 回答 3

2

RMI 的速度受两件事支配:

  1. 默认 Java 序列化
  2. 分布式垃圾收集

默认的 Java 序列化可能会非常臃肿。Externalizale您可以通过实现和执行自己的基本序列化来使您的对象序列化更加轻量级。这已经开始看起来像是在做一个自定义协议。

如果您的系统变大并包含许多 JVM,分布式垃圾收集可能会成为一个因素。DGC 涉及 JVM 交换消息,以提醒对方注意垃圾回收的对象。它可能会产生大量网络流量。

That said, RMI "out of the box" can be faster than other "out of the box" alternatives. For example, SOAP can be much less efficient on the wire and involves a much deeper and heavier network stack than RMI.

You can build a faster custom RPC than RMI, but if you rely on Java serialization, it probably won't be much faster because of point #1 above.

Finally, why do you want a faster protocol? Are you having problems with the speed of RMI? Are you looking to pick the fastest "out of the box" solution upfront? Keep in mind The rules of Optimize Club.

于 2013-03-30T15:49:14.813 回答
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");
于 2013-03-30T15:34:42.683 回答
1

协议缓冲区是序列化 java 对象的最紧凑的方法之一。

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

于 2013-03-30T15:40:49.530 回答