谷歌应用引擎 - 任务队列是QuotaExceededException的解决方案吗?

时间:2010-01-07 16:19:08

标签: google-app-engine

我有一个谷歌应用引擎代码,试图发送一个大小为379KB的附件的邮件。邮件有两个收件人 - 一个在“收件人”列表中,另一个在“BCC”列表中。显然,GAE将此视为两个不同的邮件,这使得它尝试发送附件大小为758KB(379 * 2)的邮件,并导致QuotaExceededException,因为它超过每分钟500奇卡KB /分钟的配额。当邮件到达“收件人”列表中的收件人时,密件抄送(我自己)上的邮件没有收到邮件。

是否可以考虑任务队列服务来解决此问题?每当QuotaExceededException发生时,任务队列框架是否会重试将邮件传输给没有收到邮件的收件人?

此外,我计划扩展上述代码,以便将相同的邮件(带附件)发送给多个用户。如果在没有任何时间间隔的情况下尝试传输到所有收件人,这将导致QuotaExceededException的结果显而易见。在这种情况下,任务队列服务能否以任何方式帮助我?

2 个答案:

答案 0 :(得分:5)

我认为任务队列可以很好地涵盖这个用例。事实上,Google在其documentation of Task Queues中使用的示例是通过它们发送电子邮件的示例。

要考虑两件事:

  1. Google将任务队列列为 可能的实验性特征 将来可能会有变化 发布,所以如果你使用这个 对于生产代码,做好准备 你的应用程序的行为 突然改变,没有任何警告。
  2. 您需要配置队列     这样它就不会处理电子邮件     比他们没有发送更快     违反你的配额。看看     文档中的队列概念部分。
  3. 最后,您是否考虑将此大型附件作为URL托管,并且电子邮件中包含指向该附件的链接?这使得发送电子邮件变得更加容易,并且它对您的整体带宽消耗更加友好,因为只有真正想要它的收件人才能获得它。

答案 1 :(得分:2)

几乎。任务队列将重试操作,直到成功为止,但它将重试整个任务。 AFAIK它不知道或记住部分成功的任何事情。因此,如果你只是将当前的操作(发送给两个收件人)作为一项任务,我怀疑收件人在收件人:字段中会发生不好的事情,因为任务一直向他们发送电子邮件但是整体失败,每分钟一次,永远...

因此,您需要使用两个任务(在同一个队列中):每个收件人一个任务。