选项 1
让每个 MySQL 数据行由一个单独的任务处理。这样一来,您就不必担心处理时间,因为您将有 10 分钟的时间处理每一行。
如果您的表中有顺序 ID,这应该非常简单。否则,您可以通过添加 auto_increment 列来创建它们。
您的任务可能如下所示(伪代码):
function enqueueTask(int rowId)
# id >= rowId to cater to deleted rows
row = query('SELECT ... WHERE id >= rowId ORDER BY rowId LIMIT 1')
# If the row exists (might have been deleted), do whatever you need with it
# and create a task for the next row
process(row)
# Use the ID of the current row to create a task for the next one
enqueueTask(row.id + 1)
enqueueTask(1)
这实际上类似于 Google 提供的 mapreduce 实现的工作方式,只是它没有分片。
最好在处理当前行之前将任务排入队列以增加并行性,但在这种情况下,您需要解决任务在中间失败并重新启动的情况,App Engine 的任务队列自动执行。一个好的解决方案可能是仅在扫描表时排队处理,而不是立即执行,即enqueueProcessing(row) 而不是process(row)。这样,您将快速为所有行创建任务,这些任务将能够并行运行。
选项 2
使用 B 实例(以前称为 backends)。您可以将您的工作人员部署为 B 实例上的单独 module。对 B 实例的请求可以无限期地运行。但是,您仍然需要应对意外停机。如果实例获得shut down,您的工作应该能够保存状态并从中断处继续。
选项 3
将您的数据加载到数据存储中,然后使用提供的 mapreduce 实现。
这可能是一个非常缓慢且成本高昂的解决方案,但您没有说明您想对您的数据做什么,所以我会解释一下,以防您确实需要从 Google Cloud SQL 迁移。
您可以从 MySQL 将数据以 CSV 格式导出到您的计算机上:How to output MySQL query results in csv format?
您可以将其上传到数据存储区:Uploading the data to App Engine
所有链接都指向 Python 文档,因为您没有说明您使用的是哪种语言。不过,这些原则将成立。