Nginx限流

有好几个业务要访问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

  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【转】架构漫谈(四):如何做好架构之架构切分

    架构漫谈是由资深架构师王概凯 Kevin 执笔的系列专栏,专栏将会以 Kevin 的架构经验为基础,逐步讨论什么是架构、怎样做好架构、软件架构如何落地、如何写好...

    YG
  • Query Auto Completion自动完成查询(一)

    当我们用搜索引擎或其他工具搜索内容时,输入框下方的提示内容会根据你的输入进行调整展示。这个过程我们称之为Query Auto Completion(QAC)。用...

    YG
  • Nginx+lua+mysql实时存日志

    YG
  • Nginx 限制资源的访问

    剧终
  • 阿里面试官的分享Java面试中需要准备哪些多线程并发的技术要点一、概念三、常见多线程面试题:四、多线程并发的学习思路:五、总结

    一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能...

    Java架构
  • 阿里面试官的分享Java面试中需要准备哪些多线程并发的技术要点一、概念二、多线程的4种方案三、常见多线程面试题:四、多线程并发的学习思路:五、总结

    美的让人心动
  • 阿里面试官的分享Java面试中需要准备哪些多线程并发的技术要点

    下面这些是我在不同时间不同地点喜欢问的Java线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。

    美的让人心动
  • 英国研发男仆机器人:可用手机控制

    目前,英国研究小组最新设计一款智能机器人——“Care-O-Bot 3”,这款男仆机器人是家庭的好助手,也是老年人群的贴心朋友。它的弯曲手臂可以拿起饮料,有一...

    机器人网
  • moco API模拟框架视频讲解(中)

    上期讲过了moco API模拟框架视频讲解(上),本期分享内容是对于匹配到的请求进行响应。首先请求先被匹配到相应规则按照先匹配到的规则进行响应,先到先得,这一点...

    FunTester
  • OpenStack到底是发行版还是服务?

    OpenStack是一项旨在应对亚马逊网络服务及其他公有云的开源私有云技术,它正在迅速发展。你不必相信我的话,只要问问宝马、GoDaddy、富国银行、时代华纳有...

    静一

扫码关注云+社区

领取腾讯云代金券