互联网大厂的微服务架构系统应对超大流量解决方案

常见的限流方式有:

  • 限制总并发数(数据库连接池、线程池等等)

  • 限制瞬时并发数(如Nginx的limit_conn模块)

  • 限制时间窗口的平均速率(如Guava的RateLimiter、Nginx的limit_req模块)

  • 限制远程接口的调用速率、限制消息系统的消费速率

1.1 接入层限流

抗疫项目中,一般ISV会把Nginx作为业务的接入层,通过Nginx将请求分发到后端的应用集群上。接入层(流量层)是整个系统的咽喉入口, 越早挡掉请求越好,扛不住的流量越往后端传递,对后端的压力越大。

1.1.1 Nginx限流

官方提供两个模块:

  • limit_conn模块 (限制瞬时并发数)

  • limit_req模块 (限制单位时间内的请求数,速率限制,采用的漏桶算法)

limit_req

某口罩预约项目NG限流配置:

http {
......
# $binary_remote_addr 通过remote_addr这个标识来做限制
# zone=xxx:10m 生成一个大小为10M,名字为xxx的内存区域,用来存储访问的频次信息,64位可以存放163840个IP地址。
# rate=xx r/s 限制相同标识的客户端的访问频次
limit_req_zone $binary_remote_addr zone=req_perip:10m rate=30r/m; #30r/m: 限制两秒钟一个请求
limit_req_zone $binary_remote_addr zone=req_query:10m rate=5r/s; #5r/m: 限制每秒五个请求
}
server {
location /mask-appointment-service/appointment/ {
......
limit_req zone=req_perip burst=4; # 通过req_perip区域来限制
limit_req_status 507;      # 限流返回值507
......
}
location /mask-appointment-service/query/ {
......
limit_req zone=req_query; # 通过req_query区域来限制
limit_req_status 509;     # 限流返回值507
......
}
}

上述Nginx配置分别配置了 limit_req 两个规则,预约 和 查询。

  • 预约: 针对某个唯一的来源IP做速率的控制,速率为30r/m(每2秒1个请求)。

  • 查询: 针对某个唯一的来源IP做速率的控制,速率为5r/s (每1秒5个请求)。

特别注意:

rate=30r/m 很多时候会让人理解成每分钟30个请求, 其实并不是。官网的解释:

你可能感兴趣的:(架构,微服务,java)