架构

一种高性能限流方案

2022-03-23  本文已影响0人  郭彦超

一个高性能、高可用框架,设计之初至少会从单次响应时间、QPS以及TPS三个维度进行考量,但是要做到4个9的SLA仅仅只有这些还是不够的;在互联网高可用架构设计中,限流是一种经典的高可用保障模式。因为某些原因,大量用户突然访问我们的系统时,或者有黑客恶意用 DoS(Denial of Service,拒绝服务)方式攻击我们的系统时,这种未曾预期的高并发访问对系统产生的负载压力可能会导致系统崩溃。

解决这种问题的一个主要手段就是限流,即拒绝部分访问请求,使访问负载压力降低到一个系统可以承受的程度。

常用限流策略

设计思路

构建一个队列,模拟一个特定大小的令牌桶,然后向桶中以特定的速度放入令牌(token),请求到达负载均衡服务器后,必须从桶中取出一个令牌才能继续交由下游处理。如果桶中已经没有令牌了,那么当前请求就被限流,返回 503 响应。如果桶中的令牌放满了,令牌桶也会溢出。

实现概要

#假设吞吐量为1000; 不同策略使用key区分
Thread.sleep(1)
current = redis.get(key)
IF current != NULL AND current > 1000 THEN
    pass
ELSE
    redis.incr(key)
current = redis.incr(key, -1)
IF current != NULL AND current < 0 THEN
    ERROR (503, "No token currently")

小结

上一篇 下一篇

猜你喜欢

热点阅读