首页 > 其他分享 >微服务16:微服务治理之熔断、限流

微服务16:微服务治理之熔断、限流

时间:2023-09-01 14:49:05浏览次数:40  
标签:服务 请求 Service 16 流量 熔断 限流

★微服务系列

微服务1:微服务及其演进史
微服务2:微服务全景架构
微服务3:微服务拆分策略
微服务4:服务注册与发现
微服务5:服务注册与发现(实践篇)
微服务6:通信之网关
微服务7:通信之RPC
微服务8:通信之RPC实践篇(附源码)
微服务9:服务治理来保证高可用
微服务10:系统服务熔断、限流
微服务11:熔断、降级的Hystrix实现(附源码)
微服务12:流量策略
微服务13:云基础场景下流量策略实现原理
微服务14:微服务治理之重试
微服务15:微服务治理之超时

1 介绍

在互联网电商场景中,我们经常会遇到有计划的流量洪峰,比如 双11、618购物节,积分竞拍和定时抢购的疯狂场景。
这种是在预期内的,知道会发生并有一定的准备。而那些预期之外的突发流量异常,才是真正给我们带来挑战的部分,比如:

  • 硬件故障:如服务器宕机,机房断电,光纤被挖断等。
  • 缓存击穿:一般发生在应用重启导致的缓存失效,以及短时间内大量缓存过期失效时。大量的无法命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。
  • 程序BUG:如程序逻辑导致内存泄漏;JVM长时间FullGC等。
  • 新功能上线:未经过评估,导致非预期流量上涨 ( 某次功能上线,未进行有效的容量评估,导致ws长连接翻数倍)。
    单个服务因为流量变化变得不可用,这种不可用如果持续可能是出现水平和垂直双重的扩散。
    在分布式系中的某个服务故障沿着调用链向上传递,出现整体的服务雪崩,如下图,这种情况如何提升系统的稳定性和健壮性是我们首要考虑的问题。
    image

2 异常流量洪峰的常见治理手段

一般是采用限流或者熔断:避免预期外流量或故障导致的流量洪峰引起服务雪崩,沿调用向上传递,造成整个链路崩溃。
image

2.1 限流手段

限流部分,对来路流量做了限制,不允许超过预期峰值。执行过程说明:

  • 这边以示例服务 Service A 向 Service B 发起访问为例子。
  • 当Service A 感知到 Service B 的某个实例响应时间变慢或者异常返回变多之后,开始对Service B 发起限流。
  • 比如使用令牌桶原理(定速流入),每秒钟只提供N个令牌,每个请求携带一个令牌标识前行,用完即限行。
    image
  • 或者使用漏桶算法(漏斗池算法),无论请求多少,请求的速率有多大,都按照固定的速率流出,对应的就是服务按照固定的速率处理请求。
    image
  • 这样就不会超过预期我们的服务能够承载的QPS,避免被打穿的风险 。

2.2 熔断手段

熔断部分,则是直接断流,流量就不会再负载过去了。执行过程说明:

  • 这边以示例服务 Service A 向 Service B 发起访问为例子。
  • 当Service A 感知到 Service B 的某个实例响应时间变慢或者异常数不符合我们预期的,开始对Service B 发起熔断。
  • 熔断并不是对整个服务都熔断掉,而是对服务中的某个实例进行熔断,其他健康实例还是可以负载流量的。
  • 这样就避免了我们的流量持续打到的异常的实例上,造成请求有损的体验 。

3 策略实现(Service Mesh方案)

注释比较清晰了,这边就不解释了。

# DestinationRule
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: xx-svc-b-vs
  namespace: kube-ns-xx
spec:
  host: svc_b.google.com # 治理发往svc_b服务的流量
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    connectionPool:
      http:
        http1MaxPendingRequests: 50000 # 等待队列,超额熔断
        http2MaxRequests: 40000 # http请求数限制,超额熔断
        maxRetries: 2 # 同一个请求的超时次数上限限制,超过即熔断。应用于当前所有的host。
      tcp:
        maxConnections: 40000  # 后端集群总的TCP连接数,超额熔断

4 总结

云基础场景下的治理手段各种各样,这边讲解了初级版的熔断/限流方案,让用户有一个更优良的使体验。
同时在系统大面积崩溃的时候,进行系统保护,不至于全面崩塌。
在后续的章节我们逐一了解下异常驱逐、异常自动重启等高级用法。

标签:服务,请求,Service,16,流量,熔断,限流
From: https://www.cnblogs.com/wzh2010/p/17206187.html

相关文章

  • [LeetCode][416]partition-equal-subset-sum
    ContentGivenanintegerarraynums,returntrueifyoucanpartitionthearrayintotwosubsetssuchthatthesumoftheelementsinbothsubsetsisequalorfalseotherwise. Example1:Input:nums=[1,5,11,5]Output:trueExplanation:Thearraycanb......
  • CF1615F O(n) solution
    \(O(n)\)做法,目前CF最优解。首先,考虑如何计算两个串的答案。把奇数位置的值取反,那每次操作相当于\(01\to10\)或\(10\to01\)。于是当两个串\(1\)的个数相等时可以达成。可以看作若干个\(1\)在一条链上移动到新的位置。答案为距离之和,把移动贡献均摊到每条边上,那每一......
  • 16、C++ primer 变量声明和定义的关系P41
    1、什么是分离式编译?分离式编译(SeparateCompilation)是一种软件开发技术,用于将一个大型的程序分割成多个独立的源代码文件,并分别进行编译。每个源代码文件通常包含一个模块、类、函数或者其他逻辑单元的实现。2、声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须......
  • The repository 'http://mirrors.163.com/debian jessie Release' does not have a Re
    设置Debian源为国内网易源tee/etc/apt/sources.list<<EOFdebhttp://mirrors.163.com/debian/jessiemainnon-freecontribdebhttp://mirrors.163.com/debian/jessie-updatesmainnon-freecontribEOF执行apt-getupdate出现报错root@d61378b9f12b:/#apt-getupda......
  • 限流规则-流控模式之关联模式
            ......
  • unistr函数将数据库表中的unicode转为字符(\u2161转为罗马数字Ⅱ)
    一、背景在前端页面用户输入罗马数字Ⅱ时,数据存到数据库会转为Unicode编码\u2161,需通过函数重新将Unicode编码转换回去。二、uninstr函数unistr(\xxxx)将Unicode编码转换回原来的形式,因为Unicode是带有u的,即\uxxxx,需要将u给去掉,变成oracle可识别的格式,否则oracle会提示错误。......
  • P4316 绿豆蛙的归宿
    原题这篇帖子主要解释为什么正推和倒推有区别,如果想询问做法,请移步至洛谷题解区倒推:\(dp_i\)表示从\(i\rightarrown\)的期望距离,\(deg_u\)表示\(u\)点出度\[dp_u=\sum_{(u,v,w)\inE}{\frac{dp_v+w}{deg_u}}\]正推:\(dp_i\)表示从\(1\rightarrowi\)的期望距离,\(g_i\)......
  • 剑指 Offer 16. 数值的整数次方
    根本思想就是二进制能够表示任意类型的数。classSolution{public:doublemyPow(doublex,intn){//为了防止判断n为负数取反时造成溢出//用longlong类型接收longlongN=n;//记录N是否是负数intflag=0;......
  • 16、Flink 的table api与sql之连接外部系统_ 读写外部系统的连接器和格式以及Apache H
    (文章目录)本文介绍了ApacheHive连接器的使用,以具体的示例演示了通过java和flinksqlcli创建catalog。本文依赖环境是hadoop、zookeeper、hive、flink环境好用,本文内容以flink1.17版本进行介绍的,具体示例是在1.13版本中运行的(因为hadoop集群环境是基于jdk8的,flink1.17版本需......
  • 一个程序员眼中的API调用(淘宝/天猫/1688/拼多多API)
    在程序员眼中,API调用是一种重要的编程概 念,它允许开发人员通过预先定义好的接口和规范,调用其他应用程序或服务的功能。API调用是现代软件开发中不可或缺的一部分,它使得开发人员能够快速构建出复杂的应用程序,同时避免了重复开发常见的功能模块。 以下是一个程序员眼中API调......