AtomicLimit

Easyswoole提供了一个基于Atomic计数器的限流器。

原理

通过限制某一个时间周期内的总请求数,从而实现基础限流。举个例子,设置5秒内,允许的最大请求量为200,那么理论平均并发为40,峰值并发为200。

安装

composer require easyswoole/atomic-limit

示例代码

  1. /*
  2. * egUrl http://127.0.0.1:9501/index.html?api=1
  3. */
  4. use EasySwoole\AtomicLimit\AtomicLimit;
  5. AtomicLimit::getInstance()->addItem('default')->setMax(200);
  6. AtomicLimit::getInstance()->addItem('api')->setMax(2);
  7. $http = new swoole_http_server("127.0.0.1", 9501);
  8. AtomicLimit::getInstance()->enableProcessAutoRestore($http,10*1000);
  9. $http->on("request", function ($request, $response) {
  10. if(isset($request->get['api'])){
  11. if(AtomicLimit::isAllow('api')){
  12. $response->write('api success');
  13. }else{
  14. $response->write('api refuse');
  15. }
  16. }else{
  17. if(AtomicLimit::isAllow('default')){
  18. $response->write('default success');
  19. }else{
  20. $response->write('default refuse');
  21. }
  22. }
  23. $response->end();
  24. });
  25. $http->start();

注意,本例子是用一个自定义进程内加定时器来实现计数定时重置,实际上用一个进程来做这件事情有点不值得,因此实际生产可以指定一个worker,设置定时器来实现

使用

我们可以在Easyswoole全局的mainServerCreate事件中,进行限流器注册

  1. use EasySwoole\AtomicLimit\AtomicLimit;
  2. AtomicLimit::getInstance()->addItem('default')->setMax(200);
  3. AtomicLimit::getInstance()->addItem('api')->setMax(2);
  4. AtomicLimit::getInstance()->enableProcessAutoRestore(ServerManager::getInstance()->getSwooleServer(),10*1000)

以上代码表示,default这个限流器在5秒内允许的最大流量为200,而api则个限流器的最大流量为2

后续,我们可以在Easyswoole的base控制器中,进行请求拦截,例如在onRequest事件中,先进行流量检验,如果校验通过,则进行下一步操作。