RMI 是二进制网络协议的王者(速度方面),还是有其他具有更高基准速度的协议?
是否可以使用像 Netty 这样的东西来构建我自己的更快的二进制 (TCP) 协议?我是网络新手,并试图围绕可用的各种库和框架进行思考。提前谢谢!
RMI 是二进制网络协议的王者(速度方面),还是有其他具有更高基准速度的协议?
是否可以使用像 Netty 这样的东西来构建我自己的更快的二进制 (TCP) 协议?我是网络新手,并试图围绕可用的各种库和框架进行思考。提前谢谢!
RMI 的速度受两件事支配:
默认的 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.
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");
协议缓冲区是序列化 java 对象的最紧凑的方法之一。
根据您的需要,您可以将其与您自己的传输协议(原始 tcp 套接字、udp、http ..)相结合