消峰限流的方式
-
业务视角
- 验证码
- 回答问题环节
-
技术视角
-
消息队列异步化用户请求
-
限流,对流量进行层层过滤
-
nginx 层限流,
-
一是控制速率 limit_req 漏桶算法
csharplimit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit; } } **-------------------------------------------------------------** **以上配置表示,限制每个 IP 访问的速度为 2r/s** limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit **burst**=4; } } burst=4 表示每个 IP 最多允许4个突发请求,如果单个 IP 在 10ms 内发送 6 次请求 会有 1 个请求被立即处理了,4 个请求被放到 burst 队列里排队执行了, 另外 1 个请求被拒绝了。 **--------------------------------------------------------------** limit_req_zone $userId zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit; } } **基于用户ID的限流**
-
二是控制并发连接数 limit_conn_zone limit_conn
csharplimit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { ... limit_conn perip 10; limit_conn perserver 100; } 其中 limit_conn perip 10 表示限制单个 IP 同时最多能持有 10 个连接; limit_conn perserver 100 表示 server 同时能处理并发连接的总数为 100 个
-
ngx_http_upstream_module
-
-
服务端限流
- 常用的限流算法
- 时间窗口算法
- 漏桶算法
- 令牌算法
- 常用的限流算法
-
技术实现
- Nginx
- guava RateLimiter
- tomcat limitlatch
- Sentinel & Hystrix
-
方案
- 同一用户限流,根据UserID限流
- 某个IP进行限流
- 接口进行限流
限流是一种有损的技术消峰;验证码、回答问题以及异步化消息队列是无损技术消峰
-
延伸阅读
-