分布式系统服务治理-限流和熔断

限流

限流 Traffic Shaping 又谓之流量整形,主要是针对突发流量的整形,实现网络流量的平滑,防止后端服务被突然的流量洪峰冲垮。限流是一旦流量达到阀值,就启动限流处理,主要有下面三种处理

1.拒绝服务 , 快速失败

2.排队等待,主要是秒杀,抢购的场景,针对稀缺资源。

3.应用降级 ,静态数据或者默认的本地行为。

常见的限流算法

1.计时器限流算法。使用计数器统计一算时间内的请求数量来限流。 适用于服务器端资源请求的限流,不适合用来控制用户请求的限流。

2.漏桶算法 Leaky Bucket 使用一个固定容量的桶,桶底部有一个洞,请求可以任意速率流入,但是只能固定速率处理,一旦超速桶就会溢出,新的请求会被丢弃。

漏桶算法

3.令牌桶算法 和漏桶算法不同的是,使用有一个有固定容量令牌的桶,按照固定速率往桶内添加令牌,请求处理会先取令牌,没有申请到令牌则进入排队或直接拒绝。可以看出令牌桶,允许处理瞬间的大量突然请求。

令牌桶算法

限流方案主要分为下面几种,实际架构方案中,需要综合几种来共同处理,来实现更佳的限流效果

1.客户端限流

通过限制客户端发出请求来限制的。为避免单个客户端对服务的过度使用,可以在客户端进行限流,可以很好的控制全网的流量。但是由于客户端处理,应用会比较复杂,虽然可以通过统一的控制中心或配置中心做一些控制,但是算法升级会很麻烦。

这里可以采用Google开源的Guava类库中的RateLimiter来实现。 它提供一个基于令牌桶的限流方案。

API如下

Ratelimiter.cretae(速率) 0.5 表示每2秒放入一个令牌

Ratelimiter.cretae(速率,预热时间,时间单位) 通过预热时间,调节令牌的生成速率,实现令牌数量的自然平稳增长。

Ratelimiter.acquire();请求令牌

2.服务端限流

客户端限流可以控制单个客户端,但是不了解服务端全部状态,一个服务端可能同时服务多个客户端,因此还需要服务端限流。

服务端一般通过框架或者中间件来提供服务,如Tomcat,Dubbo等都提供了过载限流能力。

比如Tomcat的server.xml 的<Connector>项可以配置限流参数,MySQL,MongoDB,Redis等有类似能力

最后NetFlix提供的zuul组件也可以提供丰富的限流机制。

3.接入端限流

接入侧

如图APP的接入端是流量的入口,一般会接负载均衡服务器。我们知道四层负载和七层负载的区别,所以四层的限流主要针对紧急情况的限流,比如后端服务会被峰值流量冲跨。通常更多是在七层负载均衡做限流,这里主要是使用Nginx,它提供了连接数限流和请求限流两个模块。

Ngx_http_limit_conn_module

Ngx_http_limit_req_module

这里的Ngx_http_limit_req_module采用的是基于漏桶算法进行的限流,具体配置

http{

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

Server{
           location /{  limit_req zone=one burst=5 nodally
            }
      }
}

具体参数含义就不再这里详述了。

虽然Nginx内置了限流的标准话策略,但是无法满足业务应用的各种个性化需求,针对多个nginx的分布式限流策略,推荐可以使用openResty,它通过lua脚本可以非常方便让我们进行定制化策略开发。另外openResty本身是一个基于nginx+lua的高性能web平台,并内部集成饿大量扩展性强的web应用,服务和动态网关。

最后说说限流的维度和粒度。维度就是说限流的基准或者参考是什么,常用的有访问者IP,请求URL,用户令牌,用户组,设备信息等。这里要说下基于IP地址虽然简单有效,但是当网络中有nginx或者公司使用同一个IP出口防伪外网,此时就不灵了。这个有具体的方案,不知道的话,可以百度下。粒度就是限流的对象是集群还是服务,还是接口。集群粒度一般作为兜底手段,接口级别太小。所以面向服务的粒度最常见。当然对于接口,可以通过添加分组,然后基于分组做限流也是一种选择。

限流用于保证服务质量,限流的具体方案很多,一套健全的限流方案需要在各个部分都要考虑,综合上面三种,基本可以搭建出很难被流量压垮的系统。

熔断

熔断circuit breaker 类似股票市场的熔断机制或者电路的过载保险熔断,达到保护后端服务的有效手段,属于流量调控的范畴。熔断是完全禁止客户端访问。熔断的目的是为了防止单点超时阻塞,进而形成雪崩的有效方法。关于熔断的实现熔断器有三种状态

1.Closed(关闭) 熔断未开启,就是正常状态

2.Open(开启) 熔断开启,应用请求会立即返回错误或者失败,但是不会一直熔断,而是设置超时阀值,一旦到达法治,会进入半开启状态

3.Half-Open(半开启) 此时允许少量请求通过,如果请求符合预期,则会修复熔断,进入关闭;否则再次进入开启并重新计算超时。半开启模式能够有效探测服务状态,做到保护。

这块最知名的就是Netflix开源的Hystrix 它提供了熔断,隔离(分为默认进程隔离和信号量隔离),失效转移和监控功能等。

国内有阿里的Sentinel哨兵方案。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 的主要特性:

Sentinel

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342