在 GAE 中使用任务队列插入批量数据

Posted

技术标签:

【中文标题】在 GAE 中使用任务队列插入批量数据【英文标题】:Using Task Queues in GAE to insert bulk data 【发布时间】:2010-11-02 09:47:25 【问题描述】:

我正在使用 Google App Engine 创建一个网络应用程序。该应用程序有一个实体,用户将通过上传工具插入其记录。用户可以选择多达 5K 行(对象)的数据。我正在使用 DataNucleus 项目作为 JDO 实现。这是我将数据插入数据存储所采用的方法。

    从 CSV 读取数据并转换为实体对象并存储在列表中。 该列表分为较小的对象组,例如大约 300 个/组。 使用 memcache 将每个组序列化并存储在缓存中,并使用唯一的 id 作为键。 对于每个组,都会创建一个任务并将其与密钥一起插入到队列中。每个任务调用一个 servlet,该 servlet 将此键作为输入参数,从内存中读取数据并将其插入数据存储区并从内存中删除数据。

队列的最大速率为 2/min,桶大小为 1。我面临的问题是任务无法将所有 300 条记录插入数据存储。在 300 个中,插入的最大值约为 50 个。一旦从 memcache 读取数据,我已经验证了数据,并且能够从内存中取回所有存储的数据。我正在使用 PersistenceManager 的 makepersistent 方法将数据保存到 ds。谁能告诉我可能是什么问题?

另外,我想知道,是否有更好的方法来处理批量插入/更新记录。我使用了 BulkInsert 工具。但在这种情况下,它就不能满足要求。

【问题讨论】:

【参考方案1】:

这是App Engine mapreduce 的完美用例。 Mapreduce 可以从 blob 中读取文本行作为输入,它会为您分割输入并在任务队列上执行。

当您说散装装载机“无法满足要求”时,如果您说您有什么要求它不满足,这会有所帮助 - 我认为在这种情况下,问题是您需要非管理员用户上传数据。

【讨论】:

准确地说,我希望非管理员用户上传数据。用户可以选择他们每天记录的数据并通过上传工具上传到 DS。

以上是关于在 GAE 中使用任务队列插入批量数据的主要内容,如果未能解决你的问题,请参考以下文章

GAE - 在固定时间后执行许多小任务

具有任务队列问题的 Spring 安全性

谷歌云平台默认队列暂停本身

redis缓存队列+MySQL +php任务脚本定时批量入库

Celery分布式任务队列快速入门

并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之 DelayedWorkQueue