限流算法

lua 限流
  
  前言
  
  每逢大促必压测,每逢大促必限流,这估计是电商人的常态。每次大促期间,业务流量是平时的几倍十几倍,大促期间大部分业务都会集中在购物车结算,必须限流,才能保证系统不宕机。
  
  限流算法
  
  限流算法一般有三种:令牌桶,漏桶,计数器。本文介绍最粗暴的计数器算法,其他算法请自行google、百度,讲的应该比我好。(能解决问题的算法都是好算法)
  
  lua 限流
  
  业务结构
  
  在大促期间由于流量过高,现有服务器无法承受那么大的流量,租用云服务是很好的选择。
  
  业务架构图可以看出 ,我们的服务器有自有服务器,首都在线云,金山云。自有服务器由于采购时间原因,每个批次的服务器性能不是很一致,首都在线云、金山云的服务器性能又有很大的差别,
  
  lvs在权重设置上也有很大的不同,这对我们使用lua限流又造成了一定的困扰。当然这只是小问题,既然lvs只是权重,那么我们的lua限流也支持权重即可。
  
  nginx+lua
  
  使用nginx+lua的原因很简单,我们服务架构nginx+fastcgi+php,为了防止php进程被打满,我们只需要在nginx加一层限制,就可以简单粗暴的解决问题,而lua正好满足这个条件。业务场景的不同,我们选择的算法也不同,越是复杂的东西,越希望最简单话的解决方案。引入越多的东西,就会造成更多的不确定性。
  
  话不多说上代
  
  ngx.header.content_type = "text/html; charset=utf-8";
  
  local method=ngx.req.get_method(www.dfgjyl.cn/ )
  
  local curl=ngx.md5(ngx.var.request_uri);
  
  local request_uri_without_args = ngx.re.sub(ngx.var.request_uri, "\\?.*", "");
  
  local match = string.match
  
  local ngxmatch=ngx.re.match
  
  --限流计数
  
  function limit_url_check(key,s,m)
  
     local localkey=key;
  
     local yyy_limit=ngx.shared.url_limit
  
  --每分钟限制
  
  local key_m_limit=  localkey..os.date("%Y-%m-%d %H:%M", ngx.time())
  
  --每秒限制
  
  local key_s_limit=  localkey..os.date("%Y-%m-%d %H:%M:%S", ngx.time())
  
  local req_key,_=yyy_limit:get(localkey);
  
  local req_key_s,_=yyy_limit:get(key_s_limit);
  
  local req_key_m,_=yyy_limit:get(key_m_limit);
  
  --每秒处理
  
  if req_key_s then
  
  yyy_limit:incr(key_s_www.ccyl178.com/  limit,1)
  
  if req_key_s>s then
  
  --return true
  
  return false
  
  end
  
     else
  
  yyy_limit:set(key_s_limit,1,60)
  
     end
  
  --每分钟处理
  
  if req_key_m then
  
  yyy_limit:incr(key_m_limit,1)
  
  if req_key_m>m then
  
  --return true
  
  return false
  
  end
  
  else
  
  yyy_limit:set(key_m_limit,1,85)
  
  end
  
  return false
  
  end
  
  代码很简单,但是很实用,看一下调用
  
  if   ngx.re.match(request_uri_without_args,"/cart/inf(.*)") then
  
  if limit_url_check("appcartinfo",www.senta77.com 24,3200) then
  
  ngx.say('{"code": 524,"msg": "啊啊啊,每逢大促,排队结账。当前访问的用户过多,请稍后再试!","alert": "啊啊啊,每逢大促,排队结账。当前访问的用户过多,请稍后再试!"}')
  
  ngx.exit www.078881.cn  (200);
  
    return
  
  end
  
  end
  
  调用的代码秒,分钟的限制数可以放到cjson中配置。
  
  以上,欢迎大神给出意见建议。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hystrix提供了限流功能,用于在高并发访问下控制系统资源。在Spring Cloud架构中,可以在网关和每个微服务中启用Hystrix进行限流处理。其中,Hystrix支持两种限流算法:线程隔离和信号量隔离。 线程隔离模式下的限流算法是通过控制调用线程允许请求HystrixCommand.GetFallback()的最大数量来实现的。可以通过配置属性hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds来设置超时时间,以及hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests来设置允许的最大并发请求数量。如果降级线程的并发数超过最大限制数,则会抛出HystrixRuntimeException异常。 信号量隔离模式下的限流算法是通过控制信号量的数量来实现的。可以通过配置属性hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests来设置允许的最大并发请求数量。如果超过最大限制数,则会直接抛出HystrixRuntimeException异常。 综上所述,Hystrix提供了线程隔离和信号量隔离两种限流算法,可以根据具体场景选择适合的算法来进行限流处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Hystrix 限流、超时、熔断和降级](https://blog.csdn.net/zsh2050/article/details/114878025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值