- 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/
在 GAE 中,我有一个应用程序将文件存储在 GAE blobstore 服务中。数据存储后,还应将其发送到未部署在 GAE 上的外部 Web 服务。我使用Java。 我的第一个想法是使用 JAX-R
我想找到一个用于验证用户、存储用户的 webapp 框架 并且具有jquery的ajax效果, 那么,你知道这个简单的框架吗? 谢谢 喜欢这个页面:http: //digu.com/reg 最佳答案
为了重新部署 GAE 应用程序,我目前必须在我用于部署的系统上安装 GAE 部署工具。虽然这个过程相对简单,但部署过程是一个手动过程,不能在防火墙后运行,并且部署工具必须安装在每台将用于更新 GAE
This链接显示 GAE 不支持开发服务器上的 cron 作业。那么我的其他选择是什么? 当用户的帐户截止日期已到时,我需要向他们发送电子邮件。 最佳答案 使用本地 cron 服务,并编写一个使用 c
我在运行 Maven GAE Plugin 的 gae:debug 目标时遇到问题.我收到的错误如下。有什么想法吗? 我用“mvn gae:debug”运行它。 [INFO] Packaging we
Google 刚刚宣布支持 App Engine 的 PHP 运行时。我有一个使用 Java 运行时开发的应用程序,它利用了 native App Engine 数据存储区。它目前用作移动客户端的后端
是否有一些前端允许管理员从 Google 应用引擎数据存储区插入、更新、删除记录以及创建修改和删除表,就像您在 mysql 上使用 phpMyAdmin 所做的那样??? 最佳答案 Google Ap
我正在以 GAE 为优势实现 PPO。以下代码是我根据OpenAI的基线实现计算GAE和返回的方式。 advantages = np.zeros_like(rewards) last_adv = 0
这是一个[python代码][1],我想知道它是否也可以用于GAE Java(当代码迁移时)。所以问题是,下面的 python 代码是否可以转换为 Java,而无需任何 Java 所没有的 pytho
当在 GAE 中收到一个 http 帖子时,我从另一个服务器下载一个 txt 文件,进行一些解析,然后返回信息。但是,当我更新这个 txt 文件并尝试通过 GAE 访问它时,似乎有延迟。这是一步一步的
当我运行 gae:run 时,它成功构建 jar 并启动服务器。但看起来服务器没有完全启动,因为我无法转到请求的页面。 当我使用 IDE(不是 maven gae 插件)和由 maven gae 插件
我知道有这样的插件可以在 vim 中调试 python:https://github.com/joonty/vdebug 我正在努力寻找调试 GAE 应用程序的方法,这可能吗?如果是这样,我应该采取什
我在 GAE 上部署了一个 webapp2 python 应用程序。有什么方法可以让我从 GAE 控制台探索源代码或更改项目文件。如果我只想更新已部署的应用程序上的单个 .py 文件而不是再次部署整个
我有一个 Google App 引擎应用程序,我希望它的工作方式有所不同,具体取决于它是在我的本地开发环境中运行(即使用 dev_appserver.py)还是在实际的 GAE 云中运行。 目前,我使
阅读 GAE NDB 数据存储的新文档: https://cloud.google.com/appengine/docs/python/ndb/modelclass#class_methods get
今天我第一次上传我的应用程序,当第一个请求进入以触发应用程序初始化时,它失败了。我已经在 Google GAE DEV 服务器上本地测试了所有内容,Google DEV 服务器和真正的 GAE 环境之
我正在使用 GAE 构建应用程序,并想为此使用 Django。哪个“补丁”更好? app-engine-patch 还是 django-gae-helpers?我指的是它们的功能和 future (其
使用 Google App Engine 标准 Python 2.7,我的dispatch.yaml 中有一个路径来指定“*/flex/*”类型的所有网址以路由到 Flex 服务。 调度.yaml调度
我需要一份关于使用 Flex+BlazeDS+Spring+GAE 的可读教程(在 GAE 数据存储中存储多个表)。有这样的吗? 最佳答案 你必须一步一步来: http://www.springsou
我们要重复 spring-boot-sample-gae 的指令一步一步,但我们仍然无法创建 WAR 文件,并出现以下错误消息: [错误] 无法在项目 gae-demo 上执行目标:无法解析项目 or
我是一名优秀的程序员,十分优秀!