<返回更多

Java性能之优化RPC网络通信

2019-09-25    
加入收藏

服务框架的核心

  1. 大型服务框架的核心:RPC通信
  2. 微服务的核心是远程通信服务治理
  1. 服务的拆分增加了通信的成本,因此远程通信很容易成为系统瓶颈
  1. 很多微服务框架中的服务通信是基于RPC通信实现的

 

性能测试

基于Dubbo:2.6.4,单一TCP长连接+Protobuf(响应时间和吞吐量更优),短连接的HTTP+JSON序列化

Java性能之优化RPC网络通信

 


Java性能之优化RPC网络通信

 

RPC通信

架构演化

无论是微服务、SOA、还是RPC架构,都是分布式服务架构,都需要实现服务之间的互相通信,通常把这种通信统称为RPC通信

Java性能之优化RPC网络通信

 

概念

  1. RPC:Remote Process Call,远程服务调用,通过网络请求远程计算机程序服务的通信技术
  2. RPC框架封装了底层网络通信序列化等技术

RMI

  1. RMI:Remote Method Invocation
  2. RMI是JDK自带的RPC通信框架,已经成熟地应用于EJBSpring,是JAVA网络分布式应用系统的核心解决方案
  3. RMI实现了一台虚拟机应用对远程方法的调用可以同对本地方法调用一样,RMI封装好了远程通信的具体细节

实现原理

Java性能之优化RPC网络通信

 

  1. RMI远程代理对象是RMI中最核心的组件,除了对象本身所在的虚拟机,其他虚拟机也可以调用此对象的方法
  2. 这些虚拟机可以分布在不同的主机上,通过远程代理对象,远程应用可以用网络协议和服务进行通信

高并发下的性能瓶颈

  1. Java默认序列化
  1. TCP短连接
  1. 阻塞式网络IO

优化路径

TCP / UDP

  1. 网络传输协议有TCPUDP,两个协议都是基于Socket编程
  2. 基于TCP协议实现的Socket通信是有连接
  1. 基于UDP协议实现的Socket通信,客户端不需要建立连接,只需要创建一个套接字发送数据给服务端
  1. 为了保证数据传输的可靠性,通常情况下会采用TCP协议
Java性能之优化RPC网络通信

 

长连接

  1. 服务之间的通信不同于客户端与服务端之间的通信
  2. 由于客户端数量众多,基于短连接实现请求,可以避免长时间地占用连接,导致系统资源浪费
  3. 服务之间的通信,连接的消费端不会像客户端那么多,但消费端向服务端请求的数量却一样多

 

优化Socket通信

  1. 传统的Socket通信主要存在IO阻塞,线程模型缺陷以及内存拷贝等问题,Netty4对Socket通信编程做了很多方面的优化
  2. 实现非阻塞IO:多路复用器Selector实现了非阻塞IO通信
  3. 高效的Reactor线程模型

4.串行设计

5.零拷贝

6.优化TCP参数配置,提高网络吞吐量,Netty可以基于ChannelOption来设置

 

定制报文格式

  1. 设计一套报文,用于描述具体的校验、操作、传输数据等内容
  2. 为了提高传输效率,可以根据实际情况来设计,尽量实现报体小,满足功能,易解析等特性

字段长度(字节)备注魔数4协议的标识,类似于字节码的魔数,通常为固定数字版本号1序列化算法1Protobuf / Thrift指令1类似于HTTP中的增删改查数据长度4数据N

编解码

  1. 实现一个通信协议,需要兼容优秀的序列化框架
  2. 如果只是单纯的数据对象传输,可以选择性能相对较好的Protobuf序列化,有利于提高网络通信的性能

linux的TCP参数设置

三次握手

Java性能之优化RPC网络通信

 

四次挥手

Java性能之优化RPC网络通信

 

配置项

1.fs.file-max = 194448 / ulimit

2.net.ipv4.tcp_keepalive_time

3.net.ipv4.tcp_max_syn_backlog

4.net.ipv4.ip_local_port_range

5.net.ipv4.tcp_max_tw_buckets

6.net.ipv4.tcp_tw_reuse

备注

1.Linux默认单个进程可以打开的文件数量上限为1024,Socket也是文件

2.与Netty的SO_KEEPALIVE配置项的作用一致

3.SYN队列的长度,加大队列长度,可以容纳更多等待连接的网络连接数

4.客户端连接服务器时,需要动态分配源端口号,该配置项表示向外连接的端口范围

5. 当一个连接关闭时,TCP会通过四次挥手来完成一次关闭连接操作,在请求量比较大的情况下,消费端会有大量TIME_WAIT状态的连接,该参数可以限制TIME_WAIT状态的连接数量,如果TIME_WAIT的连接数量超过该值,TIME_WAIT将会立即被清除掉并打印警告信息

6.客户端每次连接服务器时,都会获得一个新的源端口以实现连接的唯一性,在TIME_WAIT状态的连接数量过大的情况下,会增加端口号的占用时间,由于处于TIME_WAIT状态的连接属于关闭连接,所以新创建的连接可以复用该端口号

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>