扫描QPS控制——celery任务分多队列运行

发包QPS控制,有两个难点。redis

1. redis交互流量的限制。

假设每分钟有1000条流量任务生成,每条跑20个插件,每一个插件发5个数据包,每分钟约发十万请求。
那么在发包处作QPS会遇到一个问题,若是每次发包时先问一下redis
“这条流量在不在QPS限定范围内?若是在,这一秒这一分钟的QPS是否已经达到上限不能发送了?若是
没达到我就发送顺便redis这个域名当前秒发送量也+1”,
至少每分钟与redis交互十万次以上,估计一下redis的kbps约提高10M以上。

以后会发现,该redis流量过大阻塞集群,小则影响本身的业务,多则影响了别人的集群,DBA夺命报警连环call。
应对:

1)不在发包处作QPS控制,再往上游控制
2)若是该连接对应的业务没有QPS控制需求,就不必限制也不必交互了。编程

2. 睡眠

当QPS超过限制的时候,怎么作?首先通常的选择是睡眠。
当一个业务的QPS极低而待扫描的流量又极大时,
可能会致使全部节点全部worker都由于该业务的流量正在睡眠中,
像幼儿园整个年级都躺在睡眠室里同样其乐融融,
由于该业务的QPS限制都在等待中运行不动了。
应对:

1)选择少许节点让其随便睡,再在最上游流量去重处作对应规则。
2)超过QPS的流量就丢弃。搜索引擎

3. 最终实验的方案:

流量将经过celery发送到worker时,根据流量业务的不一样,将需调控的流量发送到另外的celery任务队列中。挑选少许节点专门用来执行该队列(需qps控制)的任务。.net

在调用func.delay时须要根据流量区别,将流量和同一func造成的任务发送到不一样的队列中(这样好看点)插件

面向搜索引擎编程,找到了解决方法code

Celery 任务分多队列运行blog

待续索引

相关文章
相关标签/搜索