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小时)发送.必须确保事件处理的顺序.我需要按时间戳顺序处理,这是在车辆内部的嵌入式设备上生成的.
我现在有什么?
由使用者调用并创建任务的Rest servlet(事件数据在有效负载上).
在此之后,工作者servlet获得此任务并且:
反序列化事件数据;
将事件放在数据存储区中;
更新数据存储上的车辆.
那么,有没有什么方法可以确保FIFO行为?或者我怎样才能改进这个解决方案呢?
好的。我就是这样做的。
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)
这样我可以暂停“常规”队列,以便在不丢失事件的情况下进行数据维护。
谢谢您的回答。我的解决方案是它们的混合。
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |