架构师进行高性能RPC框架选型时,主要考虑以下因素:
1、I/O调度模型
同步阻塞I/O(BIO)还是非阻塞I/O(NIO)。这个比较好理解。
2、序列化框架
文本协议、二进制协议或压缩二进制协议。这句话是网上经常看到的,但其实表述很不完整。之前初学时有人问,JSON文本传输时不也是二进制么,当时就懵了。文本协议如JSON将整个消息作为文本传输,而像ProtoBuf会针对每个属性区分,如int类型属性传输时只需分配4个字节,byte类型只需分配1个字节,而JSON都作为文本考虑兼容中文就是两个字符16个字节,所以降低了传输packet大小。同时ProtoBuf采用了类似网络协议TLV的机制,非常方便反序列化,而JSON就得去解析文本格式,哪里是冒号逗号啥的。
3、线程调度模型
高性能RPC肯定是多线程,这点其实主要指的是传统多线程还是如AKKA无锁的Actor模型机制。
4、承载的通道协议
通道协议主要考虑两方面,一个是性能,如HTTP2比HTTP做了很多优化,如头部压缩,通路复用等;还有一个是安全,如SSH或HTTPS或TCP + TLS。
除了上面4点外,还可以考虑IDL(接口定义语言),这点一般所有RPC框架都会提供很灵活的接口定义能力;还有就是框架是否提供多语言版本如Java、C等,这对多语言子系统间RPC很有用。
目前业内常见的RPC框架有REST调用、GRPC/Thrift(国外)、Dubbo/BRpc(国内)、RMI/Webservice(淘汰)等,推荐使用谷歌的GRPC,很稳定(ProtoBuf已经用了很多年了),性能好,生态好,社区也很活跃。