哨兵走0.4.0发布,支持热点流量防护能力

  

  哨兵是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流,流量整形,熔断降级,系统自适应保护等多个维度来帮助开发者保障微服务的稳定性.Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀,冷启动,消息削峰填谷,集群流量控制,实时熔断下游不可用服务等,是保障微服务高可用的利器,原生支持Java/去/c++等多种语言,并且提供Istio/代表/沙发MOSN全局流控支持来为服务网格提供高可用防护的能力。

  

近期,   哨兵走0.4.0正式发布,带来了   热点参数流控特性,可以自动识别统计传入参数中的“热”点参数值并分别进行流控,对于防刷,热点商品访问频次控制等场景非常有用,是高可用流量防护中重要的一环。下面我们来了解一下热点参数流控的场景和原理。

  

     热点流量防护介绍

  

流量是随机的,不可预测的。为了防止被大流量打垮,我们通常会对核心接口配置限流规则,但有的场景下配置普通的流控规则是不够的。我们来看这样一种场景——大促峰值的时候,总是会有不少“热点“商品,这些热点商品的瞬时访问量非常高。一般情况下,我们可以事先预测一波热点商品,并对这些商品信息进行缓存“预热”,以便在出现大量访问时可以快速返回而不会都打到DB上。但每次大促都会涌现出一些“黑”马商品,这些“黑”马商品是我们无法事先预测的,没有被预热。当这些“黑”马商品访问量激增时,大量的请求会击穿缓存,直接打到数据库层,导致DB访问缓慢,挤占正常商品请求的资源池,最后可能会导致系统挂掉。这时候,利用铁卫军的热点参数流量控制能力,自动识别热点参数并控制每个热点值的访问每秒或并发量,可以有效地防止过“热”的参数访问挤占正常的调用资源。

  

  哨兵走0.4.0发布,支持热点流量防护能力”>
  <p>再比如有的场景下我们希望限制每个用户调用某个API的频率,将API名称+ userId作为埋点资源名显然是不合适的。这时候我们可以在给API埋点的时候通过
  <代码> WithArgs (xxx) </代码>将userId作为参数传入到API埋点中,然后配置热点规则即可针对每个用户分别限制调用频率;同时,哨兵也支持针对某些具体值单独配置限流值,进行精细化流控。</p>
  <p>热点参数埋点/规则示例:</p>
  <前>
  <代码类=//埋点示例   e、b:=前哨。条目(“my-api sentinel.WithArgs (rand.Uint32() % 3000,“哨兵”,uuid.New () .String ()))//规则示例   _,呃=hotspot.LoadRules ([] * hotspot.Rule {   {   资源:“my-api”,   MetricType:热点。每秒,//请求量模式   ControlBehavior: hotspot.Reject,   ParamIndex: 0,//参数索引,0即为第一个参数   阈值:50,//针对每个热点参数值的阈值   BurstCount: 0,   DurationInSec: 1、//统计窗口时长,这里为1 s   SpecificItems:地图(hotspot.SpecificValue) int64 {//支持针对某个具体值单独配置限流值,比如这里针对数值9限制请求量=0(不允许通过)   {ValKind:热点。KindInt ValStr:“9”}: 0,   },   },   })      

像其他规则一样,热点流控规则同样支持通过动态数据源进行动态配置。

  

哨兵去提供的RPC框架整合模块(如达博,gRPC)均会自动将RPC调用的参数列表附带在埋点中,用户可以直接针对相应的参数位置配置热点流控规则。目前热点规则仅支持基本类型和字符串类型,后续社区会进一步进行完善,支持更多的类型。

  

哨兵走的热点流量控制基于缓存淘汰机制+令牌桶机制实现.Sentinel通过淘汰机制(如LRU, LFU弧策略等)来识别热点参数,通过令牌桶机制来控制每个热点参数的访问量。目前0.4.0版本采用LRU策略统计热点参数,在后续的版本中社区会引入更多的缓存淘汰机制来适配不同的场景。

  

     高可用流量防护最佳实践

  

在服务提供方(服务提供者)的场景下,我们需要保护服务提供方不被流量洪峰打垮。我们通常根据服务提供方的服务能力进行流量控制,或针对特定的服务调用方进行限制。为了保护服务提供方不被激增的流量拖垮影响稳定的性,我们可以结合前期的容量评估,通过哨兵配置每秒模式的流控规则,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。同时可以结合热点参数流控进行细粒度的流量防护。

哨兵走0.4.0发布,支持热点流量防护能力