打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
微服务的可靠性设计和性能设计

一:可靠性设计

微服务框架中,各个服务间进行通信时,网络闪断、网络超时、通信对端宕机等故障时有发生,为了保证异常场景下系统的可用性,通信框架必须具备很高的可靠性,对于大多数电信软件,需要能够支持5个9的高可靠性。下面对常用的三个常用的可靠性设计进行一下说明:

1:链路有效性检测

当网络发生单通、连接被防火墙Hang住、长时间GC或者通信线程发生非预期异常时,会导致链路不可用且不易被及时发现。特别是异常发生在凌晨业务低谷期间,当早晨业务高峰期到来时,由于链路不可用会导致瞬间的大批量业务失败或者超时,这将对系统的可靠性产生重大的威胁。

从技术层面看,要解决链路的可靠性问题,必须周期性地对链路进行有效性检测。目前最流行和通用的做法就是心跳检测。心跳检测机制分为三个层面

  • 1)TCP层面的心跳检测,即TCP的Keep- Alive机制,它的作用域是整个TCP协议栈。

  • 2)协议层的心跳检测,主要存在于长连接协议中,例如SMPP协议。

  • 3)应用层的心跳检测,它主要由各业务产品通过约定方式定时给对方发送心跳消息实现。

心跳检测的目的就是确认当前链路可用,对方活着并且能够正常接收和发送消息。无论发生心跳超时还是心跳失败,都需要关闭链路,有客户端发起重连操作,保证链路能够恢复正常。

2:断连重连机制

当发生如下异常时,客户端需要释放资源,重新发起连接

  • 1)服务端因为某种原因,主动关闭连接,客户端检测到链路被正常关闭

  • 2)服务端因为宕机等故障,强制关闭连接,客户端检测到链路被Rest掉:

  • 3)心跳检测超时,客户端主动关闭连接

  • 4)客户端因为其他原因(例如解码失败),强制关闭连接。

  • 5)网络类故障,例如网络丢包、超时、单通等,导致链路中断。

客户端检测到链路中断后,等待 INTERVAL时间,由客户端发起重连操作,如果重连失败,间隔周期 INTERVAL后再次发起重连,直到重连成功

为了保证服务端能够有充足的时间释放句柄资源,在首次断连时客户端需要等待INTERVAL时间之后再发起重连,而不是失败后就立即重连。为了保证句柄资源能够及时释放,无论什么场景下的重连失败,客户端都必须保证自身的资源被及时释放,包括但不限于 Socketchannel、 Socket等。重连失败后,需要打印异常堆栈信息,方便后续的问题定位。

3:消息缓存重发

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

二:性能设计

分布式服务框架对服务间通信有很高的性能要求,常见的设计思想主要有以下两点:

1:传输方式:

传统的RPC框架或者基于RMI等方式的远程服务(过程)调用采用了同步阻塞I/O,当客户端的并发压力或者网络时延增大之后,同步阻塞IO会由于频繁地wait导致I/O线程经常性的阻塞,由于线程无法高效工作,I/O处理能力自然下降。异步非阻塞通信,可以同时并发处理成百上千个客户端。由于读写操作都是非阻塞的,就可以充分提升I/O线程的运行效率,避免由频繁的I/O阻塞导致的线程挂起。另外,异步通信模式,一个I/O线程可以并发处理N个客户端连接和读写作业,这从根本上解决了传统同步阻塞I/O一连接一线程模型,架构的性能,伸缩能力都得到了极大的提升。

2:序列化框架:

相比于其他开源的序列化框架,java序列化后的码流太大,无论是网络传输还是持久化的硬盘,都会导致额外的资源占用。选择一个高性能的序列化框架,会对性能有一定幅度的提升。如Google的Protobuf二进制序列化框架。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Netty系列之Netty可靠性分析
【剖析 | SOFARPC 框架】系列之链路追踪剖析
[转载]使用Iperf调整网络
京东资深架构师:高性能高并发服务的瓶颈及突破思路
PPT | 可靠性设计准则
中国外贸步枪的英文性能手册
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服