- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法确保 GAE 上任务队列的 FIFO(先进先出)行为?
GAE 文档说 FIFO 是影响任务执行顺序的因素之一,但同一份文档说“系统的调度可能会‘跳’新任务到队列的头部”,我已经通过测试。结果:我的事件正在乱序处理。
Docs says:
https://developers.google.com/appengine/docs/java/taskqueue/overview-push
The order in which tasks are executed depends on several factors:
The position of the task in the queue. App Engine attempts to process tasks based on FIFO > (first in, first out) order. In general, tasks are inserted into the end of a queue, and executed from the head of the queue.
The backlog of tasks in the queue. The system attempts to deliver the lowest latency possible for any given task via specially optimized notifications to the scheduler. Thus, in the case that a queue has a large backlog of tasks, the system's scheduling may "jump" new tasks to the head of the queue.
The value of the task's etaMillis property. This property specifies the earliest time that a task can execute. App Engine always waits until after the specified ETA to process push tasks.
The value of the task's countdownMillis property. This property specifies the minimum number of seconds to wait before executing a task. Countdown and eta are mutually exclusive; if you specify one, do not specify the other.
我需要做什么?在我的用例中,我每天将处理来自车辆的 1-2 百万个事件。这些事件可以以任何时间间隔(1 秒、1 分钟或 1 小时)发送。必须确保事件处理的顺序。 我需要按时间戳顺序进行处理,该顺序在车内的嵌入式设备上生成。
我现在有什么?
由消费者调用并创建任务的 Rest servlet(事件数据在有效负载上)。
在此之后,一个工作 servlet 得到这个任务并且:
反序列化事件数据;
将事件放在数据存储上;
在数据存储上更新车辆。
那么,有没有什么方法可以确保 FIFO 行为呢?或者我怎样才能改进这个解决方案来获得这个?
最佳答案
您需要通过三个独立的步骤来解决这个问题:
实现 Sharding Counter单调生成增加 ID
。尽管我喜欢使用 timestamp
来自谷歌的服务器来指示任务排序,看来是时间戳GAE 服务器之间的差异可能超出您的要求。
将您的任务添加到 Pull Queue
而不是 Push Queue
.什么时候构建您的 TaskOption
,添加从步骤 #1 获得的 ID
作为 tag .添加任务后,将 ID
存储在数据存储区的某个位置。
让你的 worker servlet lease Tasks
by a certain tag来自 Pull Queue
。查询数据存储以获取您需要获取的最早 ID,并将 ID
用作租约标签
。通过这种方式,您可以为您的任务队列模拟 FIFO 行为。
完成处理后,从数据存储中删除 ID
,不要忘记从 Pull Queue
中删除 Task
也。此外,我建议您在后端运行任务消费。
更新:正如 Nick Johnson 和 mjaggard 所指出的,步骤 #1 中的分片似乎无法生成单调递增的 ID,因此需要其他 ID 来源。我似乎记得您使用的是车辆生成的时间戳,是否可以使用它来代替单调递增的 ID?
无论采用何种方式生成ID,其基本思路都是利用datastore的查询机制,生成Tasks
的FIFO排序,并使用task的Tag
拉取具体的来自 TaskQueue
的任务。
不过有一个警告。由于高复制数据存储的最终一致性读取策略,如果您选择 HRD 作为您的数据存储(并且您应该从 2012 年 4 月 4 日起弃用 M/S),查询可能会返回一些陈旧数据第 2 步。
关于java - 有没有办法确保 GAE 上任务队列的 FIFO(先进先出)行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982369/
我在使用带有 vector STL 的迭代器时遇到了这个错误。 代码:- #include #include void print_vec(std::vector vec) { auto
JAVA:两个引用“p”&&“pp”之间有区别吗? PrintStream p = new PrintStream(System.out); p.println("lol");
我尝试从主分支中拉出,但收到错误消息: $ git --no-optional-locks -c color.branch=false -c color.diff=false -c color.sta
我面临着一个让我抓狂的问题! 我有一个函数,这个: void load_weapons3(t_env *e, char *name, int x, t_weapon *w) { char
我正在尝试使用 CUDA 中的最小值、最大值、总和和平均值实现并行归约。 这是我目前的主要代码片段。 int main() { const auto count = 8; const
我知道 double free 或 corruption 错误通常是对 big 3 的违规,但在这种情况下,我找不到违规发生的地方。我有一个复制构造函数、析构函数和赋值运算符,适用于任何处理指针的东西
GTK+ 中的“focus”和“focus-in(out)-event”信号有什么区别?哪个先发射?它们与键盘(TAB)和鼠标点击有什么关系。他们互相依赖吗? 我问这个是因为我想在顶层窗口中跟踪当前聚
*** glibc detected *** /home/ghoshs/workspace/Simulator/Debug/Simulator: double free or corruption (
#include #include #include #include using namespace std; #define MAX_WEIGHT 1000000 class Set {
我在服务器上有两个分支一个叫 R2 的分支和一个叫 DEV 的分支我无意中登录了错误的服务器,进入了存储库并执行了GIT pull 源开发但是存储库在 R2 上。所以我意识到我的错误然后尝试通过做一个
我有一个包含循环的大约 1000 个顶点和 3000 个边的有向图。 我试图从给定的顶点找到所有下游(出)路径。 使用以下 Gremlin 查询时 g.V(45712).repeat(out().si
使用 Delphi XE 2 我试图确定缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且图像的 OnGesture 事件中的 EventInfo 属性没有此信息. 我见
我正在尝试创建一个 Zoom_image 函数,它使用离散傅里叶变换来缩放灰度图像。如果图像大小小于或等于 4*4 但大小增加,我包含的代码可以工作。它给出“双重释放或损坏(出)中止(核心转储)”错误
当我执行 popAll 函数时,出现以下错误: 双重释放或腐败(出)中止(核心转储) 我想我已经将错误来源缩小到了这个函数。 IntegerStack 是我制作的一个简单的 ADT,其中包含一个名为
我有网络开发背景,我正在尝试创建类似于 this technique 的东西适用于 iOS(使用 Cocoa/Obj C)。我在谷歌搜索资源时遇到了很多困难,因为 iOS 中的“视差”往往指的是 iO
我想实现一个 faceted search对于我的一个项目。我正在使用 PHP5、Mysql 和 Symfony 1.4。显然社区指向Apache Solr这似乎正是我想要完成的。 问题是该网站将在不
我知道有 questions floating around当您没有提供明确的分支名称时,关于来自特定分支的 git pull,但是我想知道即使用户确实指定了不同的分支,是否也可以强制 pull 分支
我正在尝试将我的更改推送到 NAS 上的存储库。它以我无法理解的方式失败。 documentation声明默认情况下 push 仅适用于快进更新。很公平。所以我做了一个 git pull(我的 Rem
我刚开始使用 Oracle 的 Coherence 缓存,我注意到这一点:如果我在缓存中放入一个 ConcurrentHashMap 对象,当我检索它时,我可以看到它被转换为一个普通的 HashMap
我尝试创建一个连接到数据库的线程,从那里获取一些数据并打印到控制台。问题是当该线程完成时抛出异常: 双重免费或腐败(出局)中止(核心转储) 我尝试使用 sqlite3 和 pthread,但这两个并不
我是一名优秀的程序员,十分优秀!