在php高并发中, 应该在什么地方做限流处理?

  1. nginx里有limit_conn和limit_req模块.
  2. laravel框架里有限流中间件 throttle.
  3. 还可以自己写算法实现.
  4. 其它各种限流方式

这些有什么区别吗? 怎样选用呢?

阅读 3.5k
4 个回答

限流方式很多,不同公司有不同的做法。
1.在网关做,利用布隆过滤器实现
2.在 nginx 层做,利用nginx limit_conn和limit_req模块,或者nginx +实现
3.代码层做,比如php 本身实现限流

如果在代码层做,其实流量已经进来了,服务器压力还是有的,但是它可以自定义对某些接口自由配置限流,现在一般在Nginx 层或者网关做的会比较多

越前沿的方案,越有效,可以最大限度的减少服务器开支,但是缺点就是距离业务太远,以至于无法由业务来进行调配。

比如,通过 Nginx 进行限制,那么就会在 Nginx 层对流量进行限制,不会把请求交给 fpm ,节约了 fpm 资源。

而通过 php 代码去限制,这时候请求已经是交给 fpm 处理了,也更加贴近任务,可由业务去自由调配限度等,但是这里还是浪费了资源。

当然,大部分情况下这种限流的主要目的都是为 数据库 减轻压力。

  1. nginx是协议级别的限流,优点是配置简单,不需要编码,效果最好,缺点是无法根据业务来处理,但是
  2. 进入到PHP代码级别后可以基于业务限流,优点是可定制型强,缺点么,压力已经到PHP上面了。

生产环境下一般用nginx对每个IP每分钟或者每秒做个统一限流,防止恶意请求,此外,部分接口可以使用PHP来针对性限流

现在高并发场景基本不做限流了,上了防火墙拦截攻击后,所有流量都收。
负载均衡,CDN,分布式搞起来还怕带不动吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题