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

Posted

技术标签:

【中文标题】GAE - 在固定时间后执行许多小任务【英文标题】:GAE - Execute many small tasks after a fixed time 【发布时间】:2013-06-25 23:15:14 【问题描述】:

我想制作一个 Google App Engine 应用,在用户点击应用中的按钮后的固定时间(例如一天)向他们发送 Facebook 消息。将cron 或task queue 用于潜在的数百万个微小工作是不可扩展的。我还考虑过使用background thread 实现我自己的队列,但据我所知,这只能使用Backends API,它是为更大的使用量而设计的,并且不是免费的。

免费的 Google App Engine 应用是否有可扩展的方式在固定时间后执行大量小任务?

【问题讨论】:

【参考方案1】:

首先,如果您希望从事数以百万计的小工作,那么无论您怎么看,您都会很快超过免费配额。免费配额用于测试。

这取决于您的任务的粒度。如果您每天执行一次大量任务,则 cron 连接到 mapreduce 操作(本质上在任务队列上发送一堆任务)可以正常工作。您基本上会发出一个数据存储查询以查找需要运行的任务,并将它们发送到 mapreduce。

如果您每天(每分钟)执行数千次此任务,它可能会开始变得昂贵,因为您要发出许多查询。请注意,如果这些查询中的大多数没有返回任何结果,那么成本仍然很低。

另一种选择是将您的任务存储在内存中而不是数据存储中,这是您希望开始使用后端的地方。但是后端的维护成本很高。考虑使用 Google Compute Engine,它可以提供更便宜的虚拟机。

编辑:

如果您采用 cron/datastore 路线,则每当用户想要发送延迟消息时,您都会存储一个新实体。最重要的是,它有一个可查询的时间戳,用于发送消息的时间,可能四舍五入到最接近的分钟或最接近的 5 分钟,无论你决定你的粒度应该是什么。

然后您将有一个按设定的时间间隔运行的 cron 作业,比如每分钟。在每次运行时,它都会为给定分钟内需要发送的所有 cron 作业构建一个查询。

如果您确实每分钟确实有数十万条消息要发送,那么您不会希望从 cron 任务中执行此操作。您希望 cron 任务生成一个 mapreduce 作业,该作业将散开查询并生成任务以发送您的消息。

【讨论】:

很好的答案,谢谢!我正在查看的模型是任务连续进入并连续处理(滞后一天),所以我认为 cron + mapreduce 解决方案不起作用? 取决于您的粒度。如果您可以每 5 分钟一趟,那么每天只有 288 个电话,这还不错。每分钟都将是 1440。我不会像每秒执行一个 cron 任务那样执行任何操作......此时任务将在前一个完成之前轻松启动。 这不是和以前遇到同样的问题吗?您现在不必弄清楚如何将作业排队一天,而是必须将它们排队 5 分钟。 如果您可以每隔 5 分钟发送一次消息,这将起作用。如果您需要精确到秒,那么您可能希望在 Compute Engine 上使用服务器。 我的意思是,GAE 只让你能够响应请求,那么你如何在不使用像 time.sleep 这样愚蠢的东西的情况下存储生成下一个 cron 任务所需的 5 分钟的消息?

以上是关于GAE - 在固定时间后执行许多小任务的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine(GAE) - 每分钟为每个用户同时执行相同的任务

GAE:确保外部任务真正完成的首选方法是啥?

使用 JPA 在 GAE 中保存许多实体

为啥计划任务执行固定速率中的代码不起作用?

如何更新 GAE SDK?

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