详解 API Gateway 流控实现,揭开 ROMA 平台高性能秒级流控的技术细节
摘要:ROMA 平台的核心系统 ROMA Connect 源自华为流程 IT 的集成平台,在华为内部有超过 15 年的企业业务集成经验。
本文分享自华为云社区《ROMA集成关键技术(1)-API流控技术详解》,作者:中间件小哥 。
1、概述
ROMA 平台的核心系统 ROMAConnect 源自华为流程 IT 的集成平台,在华为内部有超过 15 年的企业业务集成经验。依托 ROMAConnect,可以将物联网、大数据、视频、统一通信、GIS 等基础平台及各个应用的服务、消息、数据统一集成适配以及编排,屏蔽各个平台对上层业务的接口差异性,对上提供服务、消息、数据集成使能服务,以支撑新业务的快速开发部署,提升应用开发效率。适用于平安园区、智慧城市、企业数字化转型等场景,图 1 展示了 ROMA Connect 的功能视图。
图 1 ROMA Connect 功能视图
其中 APIC(APICConnect)作为核心组件包含了 API Gateway 能力,承载了 API 的集成和开放能力,流控作为 API Gateway 的关键特性,为用户的 API 集成、开放提供了快速、有效的安全防护,本文将详细描述 API Gateway 流控实现,揭开高性能秒级流控的技术细节。
2、高并发高吞吐系统流控需求
2.1 流量控制的动因
在高并发高吞吐系统中,通常的技术关键词是降级、缓存、流控等,流控更是其中的核心技术,当然,这些技术是相辅相成的。
流控的价值
1. 提升系统稳定性/防止雪崩
2. 保障高优先级服务
3. 降低响应时延,提升用户体验
4. 提升系统有效吞吐量
5. 限制性业务使用等
6. …
流控的目标参数
1. 限制总并发数(比如数据库连接池、线程池)
2. 限制瞬时并发数(如 nginx 的 limit_conn 模块)
3. 限制时间窗口内的平均速率
4. 限制远程接口调用速率
5. 限制 MQ 的消费速率
6. 限制网络流量
7. 限制 CPU 与内存的使用率
8. …
2.2 业务挑战
在大业务场景下,主要挑战是高并发、低时延、高精度、多维度灵活扩展等诉求。
图 2 业务挑战
而对于流控的具体挑战如下:
每天 10 次与每分钟 10 万次的流控同时存在
流控反馈周期比流控周期还久
流控的维度特别多
流控同步处理时间影响用户体验
流控静态设置,要么过高要么过低
流控失效造成业务失效
流控节点部署复杂资源消耗高
…
3、常见流控技术分析
3.1 常见流控逻辑架构
图 3 常见流控逻辑架构
各种方案的优缺点如下表所示:
3.2 常见流控算法
3.2.1 计数器算法
优点:1. 算法简单易实现。
不足:1. 输出不平滑。2. 有临界问题,在流控周期边界处易发生输出激增,大幅超过流控阈值,冲坏后端服务。
3.2.2 滑动窗口算法
优点:1. 可以解决计数器算法的临界问题。2. 算法简单易实现。
不足:1. 精度要求越高需要的窗口格子越多,内存开销较大。2. 不保证输出平滑。
3.2.3 漏桶算法
优点:1. 输出速度与输入速度无关,是恒定的,流控效果平滑。2. 无临界问题。3. 不依赖令牌。
不足:1. 由于漏桶输出速度恒定,所以不支持一定程度的突发请求。2. 如果桶满,输入数据会被丢弃
3.2.4 令牌桶算法
优点:1. 允许一定程度的突发流量。2. 通过定制令牌添加方法,可定制复杂的流控策略。3. 无临界问题。
不足:1. 当桶内无可用令牌时,输入请求会被直接丢弃。2. 不支持按优先级处理输入请求。
4、ROMAConnect 流控技术实现
4.1 总体策略
对高精度与高吞吐进行分层, 区别不同场景的流控,采用不同策略与算法
对高精度低吞吐流控进行持久化; 高吞吐高频纯内存计数策略
高吞吐高频流控, 不进行 HA 保障, 故障后数据清零重新计算
多维度多优先级,采用 Policy 多维度控制, 单一请求可触发多 Policy
解耦复杂控制, 采用多条简单策略分别映射;降低用户使用复杂度
单一请求可触发所有满足条件的 Policy, 进行综合流控
通过分发策略、异步、批申报等机制,降低请求时延与降低 Controller 工作量
尽可能在 Filter/SDK 级别处理, 避免流控请求影响业务时延
尽可能少上报到 Controller, 降低 Controller 负载提升 Controller 效率
Filter 与算法门限降级放通,避免 Ratelimit 机制故障对业务造成影响
采用 KEY/VALUE 模式和多维, 提供通用机制,适应不同场景不同应用流控诉求
立足 API Gateway 第一个应用场景
Controller 不需理解具体业务,由基于 SDK 封装的 Filter 适配具体业务与流控 Controller
4.2 逻辑视图
RateLimit SDK 访问根据一致性 hash 访问 sharding 后的 RateLimit Controller,对于高吞吐高精度的流控集中在 Controller 内存进行限流计算。
RateLimit Controller 对于高精度高吞吐只集中在本地内存计算,无需考虑 crash 后保留历史限流信息。
RateLimit Controller 对于高精度低吞吐的限流采取异步持久化策略,确保 Controller crash 后流控的精度。
当 RatelimitController 服务终止的时候,RatelimitSDK 支持自动降级。
根据 API Gateway 采集的 API Response latency 等信息反馈,支持动态调整流控策略。
支持 SLA-Based 流控 Policies。
4.3 架构设计
采用独立的 Controller 方案
独立集群 Controller 提供全局精确高吞吐流控
Controller 内部采用 Sharding 机制
采用通用的 Policy 与 Key/Value 模型
采用可扩展的 Domain/Policy 机制,适应不同业务场景
不同 Policy 关联不同的算法
提供 SDK 与 Tools,开发 API G 等插件
提供可重用的 SDK 与调试工具等
预实现 API Gateway 等流控插件
外置日志、流控数据分析模块
通过数据挖掘、预测等反馈到配置/策略管理模块,动态修订流控策略
4.4 内置算法
4.4.1 带缓存带颜色的令牌桶算法
令牌桶算法的问题:
当无可用令牌时, 请求会被立即拒绝。而用户可能会继续不断发送请求,直到有可用的令牌。这会增加 API Gateway 的负载和流控服务的负载。
所有的请求以同样的概率获得令牌,不支持优先级。而在实际应用中,一些请求需要被优先处理,另一些请求可以被延迟处理或者直接拒绝。例如,应该优先处理电子商务网站的付款请求,而浏览商品的请求可以被延迟处理。
设计了一种支持缓存和优先级的令牌桶算法
缓存:
当无可用令牌时,把请求暂时放在请求队列里,待有可用令牌时再处理。
采用 FCFS 算法处理请求。
如果缓存也无可用空间,就直接拒绝请求。
令牌
令牌分为多种颜色,不同颜色代表不同优先级,如绿色、黄色、红色表示优先级由高至低。
在 API 配置文件里,可配置不同 API 的优先级。根据预先配置的优先级,对请求分配相应颜色的令牌。如果请求没有优先级,则使用默认优先级。
根据 API Gateway 系统的能力配置令牌的数量。
当低优先级的请求到达时,如果高优先级的令牌量大于预留的数量,也可分配高优先级的令牌给该低优先级的请求。对令牌设置预留量,保证低优先级请求不会耗尽高优先级的令牌。
每种颜色的令牌有单独的请求缓存。
4.4.2 高精度高吞吐量的流控算法
问题:高精度、高吞吐的矛盾
为了实现高精度流控,API Gateway 需要为每个 API 请求发送流控请求至流控服务,会很大程度降低处理请求的吞吐量。
为了提高吞吐量,API Gateway 需降低发送流控请求的频度,这会降低流控的精度。发送流控请求的频度越低,流控的精度越低。
提出一种高精度高吞吐量的流控算法 HAT(High Accuracy, HighThroughput)
把流控分为自主流控阶段和流控服务流控阶段。
设流控阈值为 L,自主流控阈值为 S,API Gateway 集群节点数量为 N,当前流控周期内已经处理的 API 数量为 R。
流控服务计算:自主流控阈值 S = L/N,并分发给每个 API Gateway 节点。
在自主流控阈值范围内,每个 API Gateway 节点可做自主流控,无需向流控服务发送流控请求。
当 API Gateway 集群中有一个节点的 API 请求量超过自主流控阈值–α时,该节点发送流控请求至流控服务,申请新的流控阈值。此时,流控服务联系 API Gateway 的其它节点获得它们处理的 API 请求量。然后,流控服务重新计算自主流控阈值 S = (L – R)/ N,并发送给各个 API Gateway 节点。
当流量余额 < δ时,不再更新自主流控阈值。
当进入下一流控周期时,流控服务重置 S,各 API Gateway 节点联系流控服务更新自主流控阈值。
算法分析
设 u 是单个流控周期内自主流控阈值更新的次数,Pi 表示第 i 个 API Gateway 节点处理 API 的速度。
单个流控周期的流控请求的数量由 L 降至 u*N。
最优情况是 API Gateway 集群的每个节点的性能完全一样,此时,u = 1。当流控阈值是 10000,API Gateway 节点数量是 10 时,单个流控周期的流控请求从 10000 降至 10。
API Gateway 集群的每个节点的性能越接近,u 越接近 1。API Gateway 集群的每个节点的性能差距越大,u 越大。
4.4.3 动态流控算法
基于运行状态、趋势、API 调用链进行动态流控。
请求取得令牌后,流控服务开始处理请求,生成流控响应(接受/拒绝,降级,或黑白名单)。
基于运行状态的动态流控策略
根据使用网络状态(可用连接数,网络延迟),请求处理延迟,API Gateway 的 cpu、memory 等运行状态,动态修改流控阈值。也可等等。
当 cpu、内存等使用率远小于阈值时,正常处理请求。
当 cpu、内存等使用率接近阈值时,降低流控阈值(降级),减少 API Gateway 的负载。
当 cpu、内存等使用率超过阈值很多时,提高降低流控阈值的速度。
当无可用 cpu、内存时,直接拒绝请求。
当 cpu、内存等使用率降低至正常水平时,恢复流控阈值。
基于运行状态趋势的动态流控策略
利用机器学习,分析历史数据,生成预测模型,预测 API Gateway 的负载,提前修改流控阈值或降级服务,保证 API Gateway 负载平滑稳定。
利用机器学习发现应加入黑名单的请求。
基于 API 调用流的动态流控策略
Case: API 调用流。
设计一种基于 API 调用流的动态流控策略。
1.利用机器学习发现 API 调用流。流控服务保存 API 调用关系。
2.当系统负载较高时,当一个 API 请求达到阈值被限流后, 对于相关联的同一层次和低层次的所有 API 请求,不再访问 Redis 获取实时数据和处理,而是直接延迟处理或拒绝。
3.当 API Gateway 系统负载正常时,不启动该动态流控策略。
4.通过这种方式,可在基本不影响 API 处理速度的前提下,降低 API Gateway 的负载和流控服务的负载。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/8cd692cf9385e86c58c7376fd】。文章转载请联系作者。
评论