D 的个人博客

全职做开源,自由职业者

  menu

GAE Push 任务队列服务

任务队列主要用于异步处理,本文主要介绍 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 自行计算的,任务队列文档上描述是“如果桶中有令牌,会一直从桶中取令牌,直到桶空为止”。

任务执行

当队列中排有任务时,队列服务将自动“依次”执行任务:

  1. 队列中任务次序
    按照 FIFO(先进先出)执行队列中的任务,新加入队列的任务将被置于队尾。
  2. 任务积压
    如果队列中有积压的任务的话,调度器将找出处理延迟最小的任务进行执行。也就是说可能会跳过队首任务。
  3. 执行结果
    如果任务执行处理后返回 HTTP 状态码 200-299,则认为该任务处理成功;否则失败。

参考