有没有办法确保GAE上的任务队列的FIFO(先进先出)行为?

And*_*ati 7 java google-app-engine task-queue

有没有办法确保GAE上的任务队列的FIFO(先进先出)行为?

GAE文档说FIFO是影响任务执行顺序的因素之一,但是相同的文档说"系统的调度可以'将新任务"跳到队列的头部"并且我已经通过测试确认了这种行为.效果:我的事件正在按顺序处理.

文件说:

https://developers.google.com/appengine/docs/java/taskqueue/overview-push

执行任务的顺序取决于几个因素:

任务在队列中的位置.App Engine尝试基于FIFO>(先进先出)顺序处理任务.通常,任务被插入到队列的末尾,并从队列的头部执行.

队列中的任务积压.系统尝试通过对调度程序的特别优化的通知,为任何给定任务提供尽可能低的延迟.因此,在队列具有大量积压任务的情况下,系统的调度可以将新任务"跳转"到队列的头部.

任务的etaMillis属性的值.此属性指定任务可以执行的最早时间.App Engine始终等待指定的ETA处理推送任务.

任务的countdownMillis属性的值.此属性指定在执行任务之前等待的最小秒数.倒计时和eta是互斥的; 如果指定一个,请不要指定另一个.

我需要做什么?在我的用例中,我将每天处理1-2万个来自车辆的事件.这些事件可以任何间隔(1秒,1分钟或1小时)发送.必须确保事件处理的顺序.我需要按时间戳顺序处理,这是在车辆内部的嵌入式设备上生成的.

我现在有什么?

  1. 由使用者调用并创建任务的Rest servlet(事件数据在有效负载上).

  2. 在此之后,工作者servlet获得此任务并且:

    • 反序列化事件数据;

    • 将事件放在数据存储区中;

    • 更新数据存储上的车辆.

那么,有没有什么方法可以确保FIFO行为?或者我怎样才能改进这个解决方案呢?

And*_*ati 3

好的。我就是这样做的。

1) Rest servlet that is called from the consumer:

    If Event sequence doesn't match Vehicle sequence (from datastore)

        Creates a task on a "wait" queue to call me again

    else

       State validation

       Creates a task on the "regular" queue (Event data is on payload).


2) A worker servlet gets the task from the "regular" queue, and so on... (same pseudo code)
Run Code Online (Sandbox Code Playgroud)

这样我可以暂停“常规”队列,以便在不丢失事件的情况下进行数据维护。

谢谢您的回答。我的解决方案是它们的混合。