DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

ApiGateway Limit

原文链接

限制流量可以使 API 服务在下面的场景中更可靠:

  • 某个用户直接或间接造成了流量飙升,我们需要确保对其他用户服务可用。
  • 某个用户向 API 服务发送大量请求。 或者更糟的是,某个用户试图恶意冲垮服务器。
  • 用户发送了大量低优先级请求,但我们希望确保不会影响其他高优先级请求。 例如,发送大量分析数据请求的用户可能会影响其他用户的关键事务。
  • 系统内部产生错误,导致无法处理所有请求,不得不丢弃低优先级的请求。

负载降级

基于使用量的负载降级

我们将流量分为两种类型:关键 API 请求(例如,创建订单)和非关键请求(例如,列出历史订单)。我们有一个 Redis 集群,用于计算当前每种类型的请求数量。

基于worker利用率的负载降级

我们追踪可用的 worker 数量。如果某个 worker 太忙,无法处理分配给它的请求,它会缓慢降级非关键请求,当然是先从测试请求开始。如果降低测试请求的过程中,worker 的处理能力恢复到好的状态,那我们就可以开始缓慢地恢复流量(取消降级)。

我们使用令牌桶算法 [2] 来进行流量限制。该算法有一个集中的桶,为每一个请求分配一个令牌,并不断地缓慢地在桶中放入令牌。 如果桶为空,则拒绝该请求。在我们的例子中,每个用户都被分配一个桶,每当他们产生一个请求时,我们从这个桶中移除一个令牌。

我们通过 Redis 来实现我们的限速器。 既可以自己搭建和运维 Redis 实例,或者如果已经使用 AWS,则可以使用 ElastiCache 这样的托管服务。