2011-05-24 117 views
5

只是想知道您是否有人遇到过这个问题。我在Google App Engine上玩弄Python邮件API,并创建了一个应用程序,通过POST接受消息正文和地址,在数据存储中创建一个实体,然后每分钟运行一次cron作业,抓取200个实体并发送删除电子邮件,然后删除实体。Google App引擎锁定

我用1500封电子邮件进行了实验,在数据存储中创建了1500个实体,并发送了1500封电子邮件。然后我看看我的统计数据,并看到约。配额中使用了45,000个接收者,这怎么可能?

所以我的问题是“收件人通过电子邮件”配额实际计算在哪一点?在我创建邮件对象的时候还是我实际上是send()呢?我希望获得第二名,但配额似乎显示出不同。我确实在cron和任务之间传递邮件对象,等等。有人对此有任何信息吗?

谢谢。

更新:事实证明,我实际上发送了一个只有1500个队列的45k电子邮件。看来,一个cron作业会一直运行,直到上一个作业完成并与相同的实体一起工作。因此,问题变为“如何锁定实体并确保在发送电子邮件之前没有人选择它们”?

再次感谢!

+1

您是如何检查发送1500封电子邮件的?你确定所有200个实体在下次工作前都被发送和删除了吗? – 2011-05-24 13:38:39

+0

@Grzegorz很好的问题,会发现。 – kovshenin 2011-05-25 07:50:25

回答

2

实例化一个电子邮件对象当然不会计入您的“收件人通过电子邮件发送”的配额。与其他App Engine服务一样,您在触发RPC时使用配额,即调用send()

如果您打算通过电子邮件发送1500个收件人,并且App Engine表示您通过电子邮件发送了45,000个邮件,那么您的代码有一个错误。

+0

我想过了,今天我会做一些实验,看看我做错了什么,希望不会达到2000免费屏障;) – kovshenin 2011-05-25 08:11:53

+0

已发送更新,感谢您的回复,问题已更改;) – kovshenin 2011-05-26 09:46:20

3

使用任务发送电子邮件。

创建一个任务,将一个键作为参数,检索该键的存储实体,然后发送电子邮件。

当您的处理程序接收到正文和地址时,请按照现在的方式进行存储,但随后将任务排入发送并将数据存储区对象的密钥传递给该任务,以便知道要发送电子邮件的对象。

您可能会发现主体和地址足够小,您可以将它们作为参数传递给任务,并让任务发送电子邮件,而无需直接在数据存储中存储任何内容。

这也有一个好处,就是如果你想限制在给定时间(配额)内发送的邮件数量,你可以用这个速率设置一个任务队列。

+0

是,那就是要走的路。您可以在数据存储区的模型中添加一些状态字段,以设置电子邮件是否已排队,因此,每当cron作业检查要发送的新电子邮件时,您都不会排队处理相同的电子邮件。 – 2011-05-26 16:07:20