当系统负载压力比较大时,系统进入过负荷状态,可能是CPU、内存资源已经过载,也可能是应用进程内部的资源几乎耗尽,如果继续全量处理业务,可能会导致长时间的Full GC、消息严重积压或者应用进程宕机,最终将压力转移到集群中的其他节点,引起级联故障。通过动态流控,拒绝一定比例新接入的请求消息,可以保障系统不被压垮
除了动态流控,有时候还需要对消息的读取和发送速度做控制,以便消息能以比较恒定的速度发送到下游网元,保护下游各系统不受突发的流量冲击,通过Netty提供的流量整形功能,就可以达到控制消息读取和发送速度的目标。
流量整形功能
流量整形是一种主动调整流量输出速度的措施。一个典型的应用是基于下游网络节点的TPS指标控制本地流量的输出。流量整形与流量控制的主要区别在于,流量整形是对流量控制中需要丢弃的报文进行缓存–通常是将它们放入缓冲区或者队列。当令牌桶有足够多的令牌时,再均匀地向外发送这些被缓存的报文。流量整形与流量控制的另一区别是,整形可能会增加延迟,而流控几乎不引入额外的延迟。
流量整形工作原理:

Netty内置三种流量整形功能:
- 单个链路流量整形:ChannelTrafficShapingHandler,可以对某个链路的消息发送和读取速度进行控制。
- 全局流量整形:GlobalTrafficShapingHandler,针对某个进程所有链路的消息发送和读取速度的总和进行控制。
- 全局和单个链路综合型流量整形:GlobalChannelTrafficShapingHandler,同时对全局和单个链路的消息发送和读取速度进行控制。
流量整形主要作用:
- 防止由于上、下游网元性能不均衡导致下游网元被压垮,业务流程中断。
- 防止由于通信模块接受消息过快,后端业务线程处理不及时,导致出现"撑死"问题。
流量整形应用
只需要将流量整形ChannelHandler添加到业务解码器之前,即可对消息的读取额发送速度进行均匀控制,而且不会丢弃消息。服务端单个Channel读取速度进行整形Demo,创建客户端TCP连接,启动定时任务,以10MB/s的速度向服务端发送请求信息:
public class TrafficShappingClientHandler extends ChannelInboundHandlerAdapter {
private static AtomicInteger SEQ = new AtomicInteger(0);
static final byte[] ECHO_REQ = new byte[1024 * 1024];
static final String DELIMITER = "$_";
static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
@Override
public void channelActive(ChannelHandlerContext ctx) {
scheduledExecutorService.scheduleAtFixedRate(()
->

本文深入探讨了Netty中的流量整形功能,介绍了流量整形的工作原理及其在防止上下游系统性能不匹配导致的问题中的作用。通过使用ChannelTrafficShapingHandler等组件,可以实现对消息读取和发送速度的精确控制,避免系统过载。
646

被折叠的 条评论
为什么被折叠?



