一种构建流量控制的插槽的方法及构建后的执行数据流,用于流量控制保护服务,属于分布式环境下流量精准控制技术领域。
背景技术:
随着微服务的流行,服务之间调用关系越来越复杂,同时对系统的可用性要求越来越高。传统的流量控制方式是基于QPS指标或者令牌桶算法。
QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,来衡量域名系统服务器的机器的性能,即衡量当前系统的负载,QPS=并发量/平均响应时间;
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
令牌桶算法的基本过程如下:假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中;假设桶最多可以存发b个令牌,如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃;当一个n个字节的数据包到达时,就从令牌桶中删除n个令牌,并且数据包被发送到网络;如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在流量限制之外;算法允许最长b个字节的突发,但从长期运行结果看,数据包的速率被限制成常量r。对于在流量限制外的数据包可以以不同的方式处理:如它们可以被丢弃;它们可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输;它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。
但上述两种常用的方法存在控制规则单一,且不易扩展规则,没有优先级的概念的问题。
在分布式环境中,如果使用令牌桶机制限流,则需要额外增加一个令牌桶中心,增加实现成本且每次进行流量限制之前,还要去令牌桶中心获取令牌,从而增加额外的系统开销。
技术实现要素:
针对上述研究的问题,本发明的目的在于提供一种构建流量控制的插槽的方法及构建后的执行数据流,解决现有技术中流量控制规则单一且不易扩展规则、没有规则优先级的问题。
为了达到上述目的,本发明采用如下技术方案:
一种构建流量控制的插槽的方法,如下步骤:
步骤1、创建插槽集合,其中,插槽集合包括的功能有添加插槽功能,并记录首尾插槽的位置的功能;
步骤2、基于插槽集合包含的功能,添加所需要的插槽,即得到构建好的流量控制的插槽。
进一步,所述步骤1的具体步骤为:
步骤1.1、初始化首尾插槽的位置后,创建首插槽,并初始化首插槽,再把初始化后的首插槽的赋值给尾插槽,即得到初始DefaultProcessorSlotChain结构;
步骤1.2、基于插槽继承关系和得到的初始DefaultProcessorSlotChain结构,增加添加插槽功能和记录首尾插槽的位置的功能,其中,增加添加插槽功能是使首尾插槽能添加插槽,记录首尾插槽的位置的功能是使首插槽和尾插槽分别记录首插槽位置和尾插槽位置。
进一步,所述步骤1.2中的插槽继承关系分为四层:
第一层ProcessSlot为顶层插槽接口,定义了插槽的公共方法,公共方法包括进入插槽的方法、触发插槽判断逻辑的方法、退出插槽的方法以及退出后的处理方法;
第二层AbstractLinkedProcessorSlot为抽象类,是ProcessSlot的子类,拥有第一层ProcessSlot的全部方法;
在AbstractLinkedProcessorSlot中有next属性,用于记录下一个插槽的位置;
第三层ProcessorSlotChain为插槽集合抽象类,ProcessorSlotChain中定义两个方法:在插槽集合头部添加插槽的方法和在插槽集合尾部添加插槽的方法;两个方法中的任意一个都能用于添加每个插槽,其中,在插槽集合头部添加插槽的方法将插槽添加至头部,在插槽集合尾部添加插槽的方法将插槽添加至尾部;
第四层DefaultProcessorSlotChain负责构建整个插槽集合,即基于第三层ProcessorSlotChain中定义的两个方法和初始DefaultProcessorSlotChain结构,增加添加插槽功能和记录首尾插槽的位置的功能,记录首尾插槽的位置的功能通过第二层中的next属性来实现。
进一步,所述步骤2中,基于插槽集合包含的功能,在插槽集合的头或尾部添加继承了AbstractLinkedProcessorSlot中定义的方法的插槽,包括如下一种或几种:
NodeSelectorSlot插槽:负责收集资源的调用路径,并将收集的资源的调用路径,以树状结-构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot插槽:用于存储资源的统计信息以及调用者信息,包括资源的RT、QPS和thread count,存储资源的统计信息以及调用者信息用作为多维度限流或/和降级:
StatisticSlot插槽:用于记录、统计不同纬度的runtime指标监控信息;
LogSlot插槽:用于记录异常信息;
ParamFlowSlot插槽:用于根据热点参数进行限流控制;
SystemSlot插槽:用于通过系统的状态,包括load1,来控制总的入口流量;
AuthoritySlot插槽:用于根据配置的黑白名单和调用来源信息做黑白名单控制;
FlowSlot插槽:用于根据预设的限流规则以及StatisticSlot插槽统计的状态,来进行流量控制;
DegradeSlot插槽:用于通过资源的统计信息以及预设的规则,来做熔断降级。
一种执行流量控制的插槽的数据流,服务器的处理器接收到调用指令后,基于内存单元内加载的插槽的插槽顺序,调用插槽进行流量控制。
本发明同现有技术相比,其有益效果表现在:
一、本发明将流量控制保护拆分成为多个功能插槽,多个功能插槽之间可以自由组合重新形成新的流量控制插槽,且可以灵活新增功能插槽;需求变更时,只需要重新调整插槽顺序或者重新构造插槽即可(通过第二层中的Next属性来实现调整)。
二、本发明所采用的第二层中的Next属性来进行插槽的插入,插入后的插槽顺序代表流量控制的优先级,当流量进入后,每个插槽通过各自的规则来判断该流量是否进入下一个插槽,比如:负载插槽判断当前负载过高,则直接阻断该流量,剩下的插槽不会起作用,以保护服务的稳定性。
三、本发明根据流量的特征设置优先级,可提前阻断或者放行流量通过,比如:CPU密集型任务,可以将load控制的插槽放在前面,当load值过高,则直接阻断流量,提高了效率,减小系统开销。
附图说明
图1为本发明中初始DefaultProcessorSlotChain结构的示意图;
图2为本发明中插槽继承关系的示意图,其中,箭头代表继承关系,第一层是接口,用来定义协议,第二层是抽象类,定义模板方法;第三层是业务逻辑层,基于第四层得到插槽集合后,需遵守接口协议,必须实现接口中的模板方法才能够完成基本的插槽功能;
图3为本发明中整个插槽集合的结构示意图;
图4为本发明中将所需要的插槽添加到插槽集合中去的示意图。
具体实施方式
下面将结合附图及具体实施方式对本发明作进一步的描述。
为了保护服务的稳定性,经常需要流量为切入点,通过流量控制保护服务的稳定性,需要定制化多种流量控制的规则(比如:黑白名单、根据系统load控制、根据热点参数流量控制等)。具体方法如下:
一种构建流量控制的插槽的方法,如下步骤:
步骤1、创建插槽集合,其中,插槽集合包括的功能有添加插槽功能,并记录首尾插槽的位置的功能;具体步骤为:
步骤1.1、初始化首尾插槽的位置后,创建首插槽,并初始化首插槽,再把初始化后的首插槽的赋值给尾插槽,即得到初始DefaultProcessorSlotChain结构,如图1所示;
步骤1.2、基于插槽继承关系和得到的初始DefaultProcessorSlotChain结构,增加添加插槽功能和记录首尾插槽的位置的功能,其中,增加添加插槽功能是使首尾插槽能添加插槽,记录首尾插槽的位置的功能是使首插槽和尾插槽分别记录首插槽位置和尾插槽位置。
如图2所示,插槽继承关系分为四层:
第一层ProcessSlot为顶层插槽接口,定义了插槽的公共方法,公共方法包括进入插槽的方法、触发插槽判断逻辑的方法、退出插槽的方法以及退出后的处理方法;
进入插槽的方法:即收集系统情况,比如:当前系统的负载情况,并将该负载情况记录下来(内存)。
触发插槽判断逻辑的方法:即读取预设的插槽规则,比如:系统负载load值不能大于2,然后根据第一步收集系统负载情况(比如:load值为3),则此时根据规则判断,直接阻断该流量。
退出插槽的方法:即防止内存溢出,比如:需要将插槽处理过程中记录的信息清楚,在退出插槽时中,会将第一步进入插槽的数据(如:负载情况)清理掉。
退出后的处理方法:即回收资源。
第二层AbstractLinkedProcessorSlot为抽象类,是ProcessSlot的子类,拥有第一层ProcessSlot的全部方法;
在AbstractLinkedProcessorSlot中有next属性,用于记录下一个插槽的位置;
第三层ProcessorSlotChain为插槽集合抽象类,ProcessorSlotChain中定义两个方法:在插槽集合头部添加插槽的方法和在插槽集合尾部添加插槽的方法;两个方法中的任意一个都能用于添加每个插槽,其中,在插槽集合头部添加插槽的方法将插槽添加至头部,在插槽集合尾部添加插槽的方法将插槽添加至尾部;
第四层DefaultProcessorSlotChain负责构建整个插槽集合,即基于第三层ProcessorSlotChain中定义的两个方法和初始DefaultProcessorSlotChain结构,增加添加插槽功能和记录首尾插槽的位置的功能,记录首尾插槽的位置的功能通过第二层中的next属性来实现。
步骤2、基于插槽集合包含的功能,添加所需要的插槽,即得到构建好的流量控制的插槽。基于插槽集合包含的功能,在插槽集合的头或尾部添加继承了AbstractLinkedProcessorSlot中定义的方法的插槽,本一实施例包括如下一种或几种:
NodeSelectorSlot插槽:负责收集资源的调用路径,并将收集的资源的调用路径,以树状结-构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot插槽:用于存储资源的统计信息以及调用者信息,包括资源的RT、QPS和thread count,存储资源的统计信息以及调用者信息用作为多维度限流或/和降级;
StatisticSlot插槽:用于记录、统计不同纬度的runtime指标监控信息;
LogSlot插槽:用于记录异常信息;
ParamFlowSlot插槽:用于根据热点参数进行限流控制;
Systemslot插槽:用于通过系统的状态,包括load1,来控制总的入口流量;
AuthoritySlot插槽:用于根据配置的黑白名单和调用来源信息做黑白名单控制;
FlowSlot插槽:用于根据预设的限流规则以及StatisticSlot插槽统计的状态,来进行流量控制;
DegradeSlot插槽:用于通过资源的统计信息以及预设的规则,来做熔断降级。
一种执行流量控制的插槽的数据流,服务器的处理器接收到调用指令后,基于内存单元内加载的插槽的插槽顺序,调用插槽进行流量控制。
实施例
插槽顺序代表流量控制的优先级,基于插槽顺序插入插槽后,遵守插槽继承关系中第一层的接口协议,实现第二层中的方法,当流量进入第三层中的插槽后,每个插槽通过各自的规则来判断该流量是否进入下一个插槽,比如:QPS插槽判断当前QPS在是否在设定的期望的阈值内,若在,则流量进入下一个负载插槽,若不在,即负载过高,则QPS插槽直接阻断该流量,剩下的插槽便不会起作用,同时该流量也不会进入到对应的系统或者方法中。
以上仅是本发明众多具体应用范围中的代表性实施例,对本发明的保护范围不构成任何限制。凡采用变换或是等效替换而形成的技术方案,均落在本发明权利保护范围之内。