Google App Engine Java任务队列如何用于用户的大规模调度?

时间:2011-09-22 20:06:45

标签: google-app-engine

我正在关注GAE-J开发Java Web应用程序。

我有一个场景,用户将为一组提醒创建他的日程安排。我必须在特定的日期/时间发送电子邮件。

我无法在GAE上创建线程。所以我有任务队列的解决方案。

我可以使用任务队列实现此功能。用户将创建任务。 App Engine将在特定的日期和时间执行它。

由于

2 个答案:

答案 0 :(得分:3)

尽管正如克里斯所建议的那样,直接使用任务队列可以使用更长的提醒期(例如30天以上),并且在提醒可能被修改的情况下,更间接的方法可能是明智的。

我建议将提醒存储在数据存储区中,然后根据您的要求采用以下几种方法之一:

  • 运行一个常规的cron作业(比如每小时),该作业将获取下一个时间间隔内出现的提醒列表,并为每个提醒计划任务队列任务。
  • 您可以安排在下一个提醒(系统范围)到期时运行的单个任务,该任务会发出提醒,然后将新任务排入队列,以便下一个提醒到期。
  • 像Chris建议的那样运行后端,它会定期扫描数据存储区以获取即将发出的提醒。

在上述所有情况下,当用户以低于您设置的最小轮询间隔设置提醒时,您可能需要一些特殊的案例代码 - 可能直接将任务排入队列。您还需要考虑批量发送提醒,以最大限度地减少任务和使用的挂钟时间。

答案 1 :(得分:0)

您可以使用任务队列执行此操作 - 基本上当您收到请求'通过发送电子邮件在日期/时间X提醒我'时,您创建一个具有以下基本结构的新任务:

if current time is close to or past the given date/time X:
  send the email
else
  fail this task

如果提醒时间远在将来,那么任务的前几次安排,它将失败并安排在以后。这种方法的缺点是它不能保证任务在确实应该发送提醒时运行 - 它可能在一段时间之前或之后。考虑到你的任务可以运行10分钟,你可以减少这个窗口,所以如果你在提醒时间的10分钟内,睡到正确的时间,然后发送电子邮件。

如果提醒必须尽可能及时发送,那么只需使用Backend - 让实例永远运行并向其发送所有提醒,并且可以持续查看它具有的所有提醒发送出去并在恰当的时间发送出去。