美文网首页
Nginx限流

Nginx限流

作者: YG_9013 | 来源:发表于2017-11-17 16:31 被阅读0次

有好几个业务要访问ES集群。有些业务比较紧急,那么它们的请求应该优先处理,而有些业务对响应时间的要求不是那么在意,则可降低他们的并发量。针对于这种情况,可通过nginx的lua脚本来控制并发。

1 控制每个ip或者域名的并发量

http {
     limit_conn_zone $binary_remote_addr zone=perip :10m;
     limit_conn_zone $server_name zone=perserver:10m;
     ...
     server {
       limit_conn perserver 100;
       limit_conn perip 10;
         ...
     }
}

$binary_remote_addr:IP地址。这里配置的是IP,也可以使用如$server_name作为KEY来限制域名级别的最大连接数。
zone=perip:10m:设置zone为perip,perip是在server 中配置的,这里我们配置的是1.则意味着一个IP最多同时有10个连接。保存IP的缓存区的大小为10m。

2 通过令牌算法控制整个集群的处理速度

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
    server {
        ...
        location /search/ {
            limit_req zone=one burst=5;
        }
}

$binary_remote_addr:IP地址。这里配置的是IP,也可以使用如$server_name作为KEY来限制域名级别的最大连接数。
zone=one:10m rate=1r/s:设置zone为one,one是在location /search/中配置的。rate=1r/s则表明平均一秒钟处理一个请求。
burst=5:令牌桶中保存的令牌最多有5个。

3 通过计数器限制每个业务的并发数。

假设集群每秒钟最多处理100个请求,业务A访问量比较大,业务B的访问量比较少,那么我们就可以配置二者的并发对比为8:2,即业务A的并发每秒钟为80,业务B的并发为每秒钟20。举例代码如下:

http {
    local shared_data = ngx.shared.dict
    shared_data:set("draw", 0)

    content_by_lua_block {
        local request_uri = ngx.var.request_uri;
        if string.sub(request_uri,1,22) == "/activity/lottery/draw" then
              local val, err = ngx.shared.dict:incr("draw", 1); #进来一个请求就加1
              if val > 100 then #限流100
                  ngx.log(ngx.ERR,"draw limit val is:"..val)
                  ngx.exit(503)
              end
              ....业务处理
        end
    }
...
  log_by_lua_block{
        local request_uri = ngx.var.request_uri;
        if string.sub(request_uri,1,22) == "/activity/lottery/draw" then
              local val, err = ngx.shared.dict:incr("draw", -1); #出去一个请求就减1
              if val < 0 then 
                  ngx.shared.dict:set("draw", 0);
              end
        end

  }
}

相关文章

  • 秒杀系统设计思路

    一、限流与降级 客户端限流 按钮置灰 js控制每秒只能发送一个请求 站点层限流 1. Nginx限流 Nginx官...

  • 服务限流

    保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。限流可是Nginx接入层面的限流,也可以是服务层面的限流。 ...

  • 限流算法

    前言 保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。限流包括Nginx层面的限流以及业务代码逻辑上的限流。...

  • Nginx限流

    有好几个业务要访问ES集群。有些业务比较紧急,那么它们的请求应该优先处理,而有些业务对响应时间的要求不是那么在意,...

  • Nginx限流

    Nginx限流模块包含 连接数限流模块 ngx_http_limit_conn_module 漏桶算法实现的请求限...

  • nginx限流

    一、limit_conn_zone 其中limit_conn one 10既可以放在server层对整个serve...

  • nginx限流

    请求:for i in `seq 1 10`; do curl http://127.0.0.1:8089/inf...

  • NGINX限流

    Nginx 限流 注意: 通常情况下,将限速模块用于转发到后端接口的时候,每个IP每秒请求的次数可以设置的小一些,...

  • Tengine限流

    Tengine限流 安装 Tengine Tengine完全兼容Nginx,是基于nginx-1.18版本基础之上...

  • 【NGINX入门】11.Nginx限流算法及配置实践

    1. 摘要 本文介绍Nginx限流算法及限流配置实践及测试验证。 2. 限流算法 高并发系统有三把利器:缓存、降级...

网友评论

      本文标题:Nginx限流

      本文链接:https://www.haomeiwen.com/subject/ypwdvxtx.html