7

如何利用 “集群流控” 保障微服务的稳定性?

 2 years ago
source link: https://segmentfault.com/a/1190000041057833
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何利用 “集群流控” 保障微服务的稳定性?

发布于 12 月 3 日

简介:应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应保护、集群流控等多个维度来帮助保障服务的稳定性,同时提供秒级的流量监控分析功能。

作者:宿何

微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战。应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应保护、集群流控等多个维度来帮助保障服务的稳定性,同时提供秒级的流量监控分析功能。AHAS 不仅在阿里内部淘宝、天猫等电商领域有着广泛的应用,在互联网金融、在线教育、游戏、直播行业和其他大型政央企行业也有着大量的实践。

title=

流控是保障微服务稳定性最常用也是最直接的一种控制手段。每个系统、服务都有其能承载的容量上限,流控的思路非常简单,当某个接口的请求 QPS 超出一定的上限后,拒绝多余的请求,防止系统被突发的流量打垮。市面上最常见的方案是单机维度的流控,比如通过 PTS 性能测试预估某个接口的容量上限是 100 QPS,服务有 10 个实例,则配置单机流控 10 QPS。但很多时候,由于流量分布的不确定性,单机维度的流量控制存在一些效果不佳的情况。

典型场景 1:精确控制对下游的调用总量

title=

场景:服务 A 需要频繁调用服务 B 的查询接口,但服务 A 和 B 的容量存在差异,服务 B 约定最多给服务 A 提供总共 600 QPS 的查询能力,通过流控等手段进行控制。

痛点:若按照单机流控的策略配置,由于调用逻辑、负载均衡策略等原因,A 调用 B 到达每个实例的流量分布可能非常不均,部分流量较大的服务 B 实例触发单机流控,但总体限制量尚未达到,导致 SLA 未达标。这种不均的情况经常会发生在调用某个依赖服务或组件(如数据库访问)的时候,这也是集群流控的一个典型场景:精确控制微服务集群对下游服务(或数据库、缓存)的调用总量。

典型场景 2:业务链路入口进行请求总量控制

title=

场景:在 Nginx/Ingress 网关、API Gateway (Spring Cloud Gateway, Zuul) 进行入口流量控制,希望精确控制某个或某组 API 的流量来起到提前保护作用,多余流量不会打到后端系统。

痛点:如果按照单机维度配置,一方面不好感知网关机器数变化,另一方面网关流量不均可能导致限流效果不佳;而且从网关入口角度来讲,配置总体阈值是最自然的手段。

AHAS 集群流控

AHAS 集群流控可以精确地控制某个服务接口在整个集群的实时调用总量,可以解决单机流控因流量不均匀、机器数频繁变动、均摊阈值太小导致限流效果不佳的问题,结合单机流控兜底,更好地发挥流量防护的效果。

对于上面的场景,通过 AHAS 集群流控,无论是 Dubbo 服务调用、Web API 访问,还是自定义的业务逻辑,均支持精确控制调用总量,而无关调用逻辑、流量分布情况、实例分布。既可以支撑数十万 QPS 大流量控制,也支持分钟小时级业务维度小流量精确控制。防护触发后的行为可由用户自定义(如返回自定义的内容、对象)。

AHAS 集群防护具有以下几大优势:

  • 场景丰富:全面覆盖从网关/Mesh 入口流量精确防护、Web/RPC 服务/SQL 调用精确流控,到分钟小时级业务维度流量控制的场景,支持数十万 QPS 量级;
  • 低使用成本:无需特殊接入方式,开箱即用,快速配置;
  • 全自动管控与运维:自动化管控与分配 token server 资源,自动化运维能力保障可用性,用户无需关注服务端资源准备与分配,只需关注规则配置与业务流程;
  • 低性能损耗:性能模式下对业务链路完全无时延增加,精确模式对业务链路的 RT 损耗控制在 3ms 之内,用户可放心使用;
  • 配套的可观测能力,实时了解接口稳定性与规则生效情况。

下面我们就来用一个示例来介绍一下,如何快速将应用接入 AHAS 来玩转集群流控能力,保障服务稳定性。

快速玩转 AHAS 集群流控

第一步,我们将服务或网关接入 AHAS 流量防护。AHAS 提供多种快速便捷的无侵入接入手段:

title=

AHAS 流量防护支持 Java/Go/C++/PHP 等多语言原生接入,以及 Nginx/Ingress 网关接入和 Mesh 接入;Java 应用支持全方位的 20+ 种微服务框架/组件

  • Web 服务端:Spring Web/Spring Boot/Spring Cloud/Tomcat/Jetty/Undertow
  • Web client:OkHttp/Apache HttpClient
  • RPC:Dubbo/Feign/gRPC
  • DAO/缓存:MyBatis/Spring Data JPA/Memcached/Jedis client
  • MQ consumer:RocketMQ client/Kafka client/RocketMQ client
  • API Gateway:Spring Cloud Gateway/Zuul 1.x
  • Reactor 框架

接入 AHAS 成功后,只要触发服务调用/接口访问,即可在 AHAS 控制台看到自己的服务,并可以在监控页面看到自己的接口:

title=

title=

第二步,我们在应用左侧菜单的“集群流控-集群配置”页面,开启集群流控功能。测试应用我们可以开启“试用”集群,不同的集群规格可以承载不同的 QPS 量级:

title=

title=

第三步,我们在实时监控页面找一个接口,点击右上角的“+”号,新增流控规则。以下示例中,我们对 /doSomething 这个接口配置集群流控规则,这个接口总的访问量每秒钟不超过 200 次。规则状态为“开启”,代表新增后实时生效。

title=

title=

点击下一步,我们还可以给选择的 Web/RPC 调用配置防护规则触发后的处理逻辑,如自定义返回值。最终配置完成后,我们点击新增按钮,这条规则就会生效到每个节点。

配置完毕后,我们可以向应用集群中不同机器发起一定数量的该接口请求,可以发现每秒钟超过 200 个请求后会自动返回我们在规则中预设好的返回行为;同时控制台实时监控页面也可以看到,多余的流量被拒绝,接口每秒钟通过的总量级平稳在 200 QPS:

title=

title=

通过几步简单的配置,我们就可以快速体验 AHAS 集群流控给业务流量带来“如丝般顺滑”的保护能力;同时最近 AHAS 还新上线 Nginx/Ingress 网关入口流量防护Web 请求参数流控 等核心功能,欢迎大家点击阅读原文,在前往 AHAS 控制台进行快速体验。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK