应用限流
本文讲的应用限流,是限制单位时间PHP应用服务器总访问量,不针对接口,不针对个人用户。原做法,是通过Redis记录访问总量,通过过期时间淘汰(单位时间访问量清零)。做法简单,效果也不错,但缺点也明显,一次访问量判断和设置,就至少要一次网络开销(Redis Incr)。优化的思路是,可否省掉这一次Redis操作(直接去掉不限流了hahahaha)。限制总访问量,分摊到每台应用机上,不就是它们自己的指标了吗。对,那就应用服务器本地记录状态,本地判断。那本地怎么记录状态?多着,本地文件、APC缓存。但要考虑性能问题,本地文件就…当我没说过。APC不错,实现起来会复杂点,要考虑修改记录的冲突问题。
Redis 版本
下面给个Redis的简版,官方思路,但有bug
Redis的版本可以setnx锁来实现会更稳
我的限流PHP扩展
开头说,使用APC来实现Redis上的这个功能是可以的,只是要多的事会多点,不说了,说说APC缓存的原理吧,APC使用内存共享的来实现进程间通信,咋说,php-fpm是多进程模型,同一进程可以处理多次(不是同时处理)php请求,换句话说,php-fpm的worker进程是常驻内存的,那么,php-fpm woker进程就可以通过内存共享来达到缓存数据的功能。
那么利用内存共享不就可以在多个进程间共享本地服务器的访问量了,就可以保存访问记录了。
扩展源码
|
|