任务队列主要用于异步处理,本文主要介绍 GAE Push 任务队列服务的关键配置。
Push 队列
Push 队列即“推队列”。当应用调用任务队列 API 添加任务后,任务队列服务将“推”任务进行执行。
比如我们在 queue.xml 中的配置如下:
<queue-entries> <queue> <name>request-stat-queue</name> <rate>20/m</rate> <bucket-size>60</bucket-size> <retry-parameters> <task-retry-limit>7</task-retry-limit> </retry-parameters> </queue> </queue-entries>
表示以每分钟 20 个任务的速率从任务队列中获取任务,放入“缓存”中等待执行;每个任务执行最多重试 7 次。
而 bucket-size 表示最多可以“缓存” 60 个待执行的任务。这里引入一个流量控制的算法:Token Bucket(令牌桶)。
令牌桶算法
令牌桶算法主要是用于流量控制。在 GAE Push 队列中用于控制“推”任务的速率(从任务队列中获取任务放入“缓存”的速率),队列中的任务相当于令牌,而“缓存”就是令牌桶。
结合上面的配置例子描述如下:
- 任务(令牌)以每分钟 20 个的速率放入桶中
- 桶最多能放入 60 个任务,多于的任务将保留在队列中下次处理
- 任务调度器每次从桶中取走 n 个任务1进行执行
1. 调度器取的任务数是 GAE 自行计算的,任务队列文档上描述是“如果桶中有令牌,会一直从桶中取令牌,直到桶空为止”。
任务执行
当队列中排有任务时,队列服务将自动“依次”执行任务:
- 队列中任务次序
按照 FIFO(先进先出)执行队列中的任务,新加入队列的任务将被置于队尾。 - 任务积压
如果队列中有积压的任务的话,调度器将找出处理延迟最小的任务进行执行。也就是说可能会跳过队首任务。 - 执行结果
如果任务执行处理后返回 HTTP 状态码 200-299,则认为该任务处理成功;否则失败。
参考
- Google App Engine Java - The Task Queue Java API
- Google App Engine Java - Java Task Queue Configuration
- Token bucket Algorithm