分布式服务框架--第三章:通信框架

前言:常用的RPC通信框架:包括GRPC,Restful, Netty等。

一.网络分层图

深度截图_选择区域_20201108143210.png

二.关键技术点分析

1.长连接和短连接

1)长/短:指的是多次数据交换能否复用同一条连接,而不是连接的持续时间长短。
2)TCP连接本身并没有长短的区分,长或短只是上层应用或协议使用其方式。UDP没有连接说法。
3)HTTP1.0作为TCP的上层协议,开始支持长连接。但是存在线头阻塞问题;HTTP2.0通过引入分帧分流机制,完美解决。GRPC是给予HTTP2.0协议的RPC通信框架。
绝大多数的分布式服务框架(RPC框架)都推荐使用长连接进行内部通信。长连接优点:

  • 相比于短连接:长连接更能节省资源,不用频繁的创建链路,握手认证,释放链路。
  • 远程通信是常态,调用时延是关键指标。

备注:GRPC内部采用长连接,管理连接的方式:设定时间阈值。默认情况下,大于10s没有数据发送,grpc认为是ideal连接,server端会给client端发送GOAWAY包,client收到GOAWAY包后会主动关闭连接。下次发送包的时候,再重新建立连接。

2.BIO还是NIO

1.BIO:Blocking IO 同步阻塞IO


深度截图_选择区域_20201108150330.png

采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,接受到请求之后,为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出留返回应答给客户端,线程销毁,这就是典型的一请求一应答的通信模型。
2.NIO:NonBlocking IO 非同步阻塞IO


深度截图_选择区域_20201108150955.png

NIO采用多路复用技术,一个多路复用器Selector同时轮训多个Channle。

https://www.cnblogs.com/51try-again/p/11078674.html

三.功能设计

通信框架首先是一个通用的通信框架,它不应该与具体的协议绑定。给予通信框架之上,可以构建私有协议栈和公有协议栈。框架原理图:


深度截图_选择区域_20201108152611.png

四:可靠性设计

通信框架的可靠性设计:关键技术分析

1.链路有效性检测

目前最流行和通用的做法是心跳检测机制,分为三个层面:

  • TCP层面的心跳检测,即:TCP的Keep-Alive机制,它的作用域是整个TCP协议zhan。
  • 协议层的心跳检测,主要存在于长连接协议中,如SMPP协议。
  • 应用层的心跳检测:主要由各业务产品通过约定方式定时给对方发送心跳消息实现。
    心跳检测目的是确认当前链路可用,对方活着并且能够正常接受和发送消息。
    心跳检测机制主要分为两类:
  • Ping-Pong型心跳:由通信一方定时发送Ping消息,对方接收到Ping消息之后,立即返回Pong消息给对方,属于请求-相应型心跳。
  • Ping-Ping型心跳:不区分心跳请求和应答,由通信双发按照约定定时向对方发送心跳Ping消息,它属于双向心跳。
    心跳检测策略如下:
  • 连续N次心跳检测都没有收到对方的Pong应答消息或者Ping请求消息,则认为链路已经发生逻辑失效,称为:心跳超时。
  • 读取和发送心跳消息的时候直接发生了IO异常,说明链路已经失效,称为:心跳失败。
    无论发生心跳超时还是心跳失败,都需要关闭链路,由客户端发起重连操作,保证链路能恢复正常。

2.断连重连机制

客户端检测到链路中断后,为了保证服务端能够有足够的时间释放句柄资源,再首次断连时客户端需要等待INTERVAL时间之后再发起连接,而不是失败之后就立即重连。

3.消息缓存重发

当调用消息发送接口的时候,消息并没有真正的写入SOcket中,而是先放入NIO通信框架的消息队列中,由Reactor线程扫描待发送的消息队列,异步的发送给通信对端。


深度截图_选择区域_20201108154727.png

链路重连成功之后,根据策略,将缓存队列中的消息重新发送给通信对端。
需要指出的是:并非所有的场景都需要通信框架做重发。重发只是一个策略,通信框架应该支持链路级重发策略。

4.资源优雅释放

当系统接收到退出指令后,首先标记系统处于退出状态,不再接受新的消息,然后将积压的消息处理玩,最后调用资源回收接口将资源销毁,最后各线程退出执行。
通常优雅退出有个时间限制,比如30s。如果到达执行时间,仍然没有完成退出钱的操作,则由监控脚本直接kill -9 pid强制退出。

五.性能设计

性能差三宗罪:

  • 网络传输方式
  • 序列化性能差
  • 线程模型问题
    故从架构层面看,影响I/O通信性能的主要的三个因素:
  • 传输:选择传输数据的方式,BIO,NIO,AIO等
  • 协议:采用的通信协议,包括:公有协议,私有协议。私有协议,一般设计的性能更优。
  • 线程:线程池,Reactor线程模型?

你可能感兴趣的:(分布式服务框架--第三章:通信框架)