我想制作一个 Google App Engine 应用程序,在用户单击应用程序中的按钮后固定时间(例如一天)向用户发送 Facebook 消息。将cron或任务队列用于潜在的数百万个小型作业是不可扩展的。我也考虑过使用后台线程来实现我自己的队列,但据我所知,这只能使用后端API,它是为更大的使用量而设计的,并且不是免费的。
免费的 Google App Engine 应用程序是否有可扩展的方式在固定时间后执行大量小任务?
首先,如果你想做数百万个小工作,你会很快超过免费配额,不管你怎么看。免费配额用于测试。
这取决于您的任务的粒度。如果您每天执行大量任务,则 cron 连接到 mapreduce 操作(本质上在任务队列上发送一堆任务)可以正常工作。您将基本上发出数据存储查询以查找需要运行的任务,并将它们发送到 mapreduce。
如果您每天(每分钟)执行数千次此任务,它可能会开始变得昂贵,因为您要发出许多查询。请注意,如果大多数查询没有返回任何内容,则成本仍然很小。
另一种选择是将您的任务存储在内存中而不是数据存储中,这是您希望开始使用后端的地方。但是后端的维护成本很高。考虑使用谷歌计算引擎,它提供更便宜的虚拟机。
编辑:
如果您使用 cron/datastore 路由,则每当用户想要发送延迟消息时,您都会存储一个新实体。最重要的是,它有一个可查询的时间戳,用于发送消息的时间,可能四舍五入到最接近的分钟或最接近的 5 分钟,无论你决定你的粒度应该是什么。
然后,您将拥有一个按设定间隔运行的 cron 作业,例如每分钟。在每次运行时,它都会为给定分钟内需要发送的所有 cron 作业构建一个查询。
如果您确实每分钟确实有数十万条消息要发送,那么您不会希望从 cron 任务中执行此操作。您希望 cron 任务生成一个 mapreduce 作业,该作业将扇出查询并生成任务以发送您的消息。