构建高可用云原生应用,如何有效进行流量管理?

2023-06-0514:15:00云计算与物联网Comments524 views字数 2468阅读模式

作者: breakDawn。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解 java 虚拟机》一书作者于 21 年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

构建高可用云原生应用,如何有效进行流量管理?

因此本文以及后续都将持续沉淀发布这本书的学习笔记和思考,也欢迎购买该书进行详细学习,或者关注后续的学习笔记内容发布,了解精华内容和总结思考。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

流量治理

1 服务容错

1.1 容错策略

文章中介绍了故障转移、快速失败、安全失败、沉默失败、故障恢复、并行调用、广播调用等几种容错策略,我用表格的形式直观呈现一下这几种策略的区别,方便理解和选型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

构建高可用云原生应用,如何有效进行流量管理?

1.2 容错设计模式

1. 断路器模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

即服务中发请求的地方都通过一个断路器模块来转发发送
当 10 秒内请求数量达到 20,且失败阈值达到 50% 以上(这些参数都可以调整), 则认为出现问题, 于是主动进行服务熔断, 断路器收到的请求自动返回错误,不再去调用远程服务, 这样可避免请求线程各种阻塞,能及时返回报错。
中间会保持有间隔的重试直到恢复后,关闭断路。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

2. 舱壁隔离模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

如果一个服务中,可能要同时调用 A\B\C 三个服务,但是却共用一个线程池。
如果调用 C 服务超时,而调用 C 的请求源源不断打来,会造成 C 服务的请求线程全在阻塞,直接把整体线程池给占满了,影响了对 A\B 服务的调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

一种隔离措施是对每个调用服务分别维护一个线程池。缺点是额外增加了排队、调度、上下文切换的开销,据说 Hystrix 线程池如果开启了服务隔离,会增加 3~10ms 的延迟。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

另一种隔离措施是直接自己定义三个服务的计数器,当服务线程数量到达阈值,自动对这个服务调用做限流。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

3. 重试模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

故障转移和故障恢复这 2 个策略一般都是借助重试模式来处理的,进行重复调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

重试模式应该满足以下条件才能使用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  • 仅在主路核心逻辑的关键服务上进行同步的重试, 而非关键的服务
  • 只对瞬时故障进行重试,对于业务故障不进行重试
  • 只对幂等型的服务进行重试

重试模式应该有明确的终止条件,例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  • 超时终止
  • 次数终止

重试一定要谨慎开启, 有时候在网关、负载均衡器里也会配置一些默认的重试, 一旦链路很长且都有重试,那么系统中重试的次数将会大大增加。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

2 流量控制

流量控制需要解决以下 3 个问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  • 依据什么指标来限流
  • 如何限流
  • 超额流量如何处理

2.1 流量统计指标 (依据什么指标来限流)

  • 每秒事务数 TPS: 事务是业务逻辑上具有原子操作的业务操作,对于对买书接口而言, 买书就是一个事务, 背后的其他请求是不感知的。
  • 每秒请求数 HPS: 就是系统每秒处理的请求数, 如果 1 事务中只有 1 个请求, 那么 TPS=HPS, 否则 HPS>TPS
  • 每秒查询书 QPS: 是一台服务器能够响应的查询次数。 对于单节点系统而言,QPS=HPS,对于一个分布式系统而言 HPS>TPS

通过限制最大 TPS 来限流的话,不能够准确反映出系统的压力, 因此主流系统倾向使用 HPS 作为首选的限流指标。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

2.2 限流设计模式(如何限流)

流量计数器模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

统计每秒内的请求数是否大于阈值
缺点:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  1. 每秒是基于 1.0s-2.0 这样的区间统计, 但如果是 0.5-1.5 和 1.5-2.5 分别超出阈值,但是 1.0-2.0 没有超过阈值,则会出现问题。
  2. 每秒的请求超过阈值,也不代表系统就真的承受不住,导致五杀

滑动时间窗模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

滑动时间窗专门解决了流量计数器模式的缺点。准备一个长度为 10 的数组,每秒触发 1 次的定时器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  1. 将数组最后一位的元素丢弃,并把所有元素都后移一位,然后在数组的第一位插入一个新的空元素;
  2. 将计数器中所有的统计信息写入第一位的空元素;
  3. 对数组中所有元素做统计,清空计数器数据。可以保证在任意时间片段内,只通过简单的调用计数比较, 控制请求次数不超过阈值

缺点在于只能用于否决式限流, 必须强制失败或者降级,无法进行阻塞等待的处理。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

漏桶模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

漏桶和令牌桶可以适用于阻塞等待的限流。漏桶就是一个以请求对象作为元素的先入先出队, 队列程度等于漏桶大小,当队列已满拒绝信的请求进入。比较困难的原因在于很难确定通的大小和水的流出速度,调参难度很大。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

令牌桶模式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

每隔一定时间,往桶里放入令牌,最多可以放 X 个,每次请求消耗掉一个。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

可以不依赖定时器实现令牌的放入,而是根据时间戳,在取令牌的时候当发现时间戳满足条件则在那个时候放入令牌即可文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

2.3 分布式限流

前面的 4 个限流模式都只是单机限流,经常放在网关入口处,不适用于整个服务集群的复杂情况,例如有的服务消耗多有的服务消耗少,都放在入口处限流情况其实很多。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

可以基于令牌桶的基础上,在入口网关处给不同服务加不同的消耗令牌权重,达到分布式集群限流的目的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

总结

流量治理技术对云原生场景的重要性

以上主要介绍了服务容错和容错设计模式,涉及到不同的容错策略和容错设计模式,如故障转移、快速失败、安全失败、沉默失败、故障恢复、并行调用和广播调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

这 2 个设计可以保证系统的稳定性和健壮性。这篇文章涉及的话题与云原生服务息息相关,因为云原生应用程序之间会频繁通过进行请求和交互,需要通过容错和弹性来保证高可用性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

因此,对于那些希望使用华为云的云原生服务的人来说,这篇文章提供了很好的指导,让他们了解如何通过容错来保证他们的服务的可用性和稳定性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

华为云如何在流量治理中体现作用

如果能通过将服务 API 注册到华为云提供的 APIG 网关上,似乎能够很方便地达成上述 2 个设计。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

比如 APIG 支持断路器策略,是 API 网关在后端服务出现性能问题时保护系统的内置机制。当 API 的后端服务出现连续 N 次超时或者时延较高的情况下,会触发断路器的降级机制,向 API 调用方返回固定错误或者将请求转发到指定的降级后端。当后端服务恢复正常后,断路器关闭,请求恢复正常。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

同时 APIG 还提供了流量控制策略,支持从用户、凭据和时间段等不同的维度限制对 API 的调用次数,保护后端服务。支持按分 / 按秒粒度级别的流量控制,阅读了上文中提到的几个流量策略,再去看 APIG 里配置的流量策略值,则会很容易理解。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

构建高可用云原生应用,如何有效进行流量管理?

可以看到对于这些常见的经典服务设计策略,无需再重复造轮子,使用已有云服务,可以很快地实现相关功能,提升产品的上线速度和迭代效率。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/44611.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/44611.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定