谷歌应用引擎锁定

5
只是想知道你们是否遇到过这种情况。我在Google App Engine上使用Python邮件API,并创建了一个应用程序,通过POST接受消息正文和地址,创建一个数据存储实体,然后每分钟运行一个计划任务,获取200个实体并发送电子邮件,然后删除实体。
我进行了一项1500封电子邮件的实验,创建了1500个数据存储实体,并发送了1500封电子邮件。然后我查看我的统计数据,发现大约使用了45000个配额的接收者,这如何可能?
那么我的问题是,“已发送的收件人”配额实际上在哪个阶段计算?在我创建邮件对象的时候还是在我实际地send()它的时候?我希望是后者,但配额似乎显示了不同的东西。我确实在计划任务和任务之间传递邮件对象等。有人对此有什么信息吗?
谢谢。
更新:事实证明,我实际上正在使用只有1500个队列的45k封电子邮件发送。看来一个计划任务会一直运行,直到上一个任务完成,并且与相同的实体一起工作。所以问题变成了“如何锁定实体并确保在发送电子邮件之前没有人选择它们”?
再次感谢!

1
你是如何检查发送了1500封电子邮件的?你确定所有200个实体在下一次作业运行之前都已经被发送并删除了吗? - Grzegorz Gierlik
@Grzegorz 很好的问题,我会找出答案。 - kovshenin
2个回答

3

使用任务发送电子邮件。

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

当您的处理程序接收到正文和地址时,请像现在一样将其存储,但然后排队等待任务执行发送,并将数据存储对象的键传递给任务,以便它知道要发送电子邮件的对象。

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

这样做的好处是,如果您想在给定时间内(配额)限制发送电子邮件的数量,您可以设置具有该速率的任务队列。


是的,这是正确的方法。您可以在数据存储中为模型添加一些状态字段,以设置电子邮件是否已排队,因此每次cron作业检查要发送的新电子邮件时,您不会重复排队相同的电子邮件。 - Tom van Enckevort

2

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

如果您打算发送1500个收件人,并且App Engine显示您已发送了45000个收件人,则说明您的代码存在错误。


我考虑了一下,今天会进行一些实验来看看我做错了什么,希望不会达到2000个免费限制 ;) - kovshenin
发送了更新,感谢您的回复,问题已经改变 ;) - kovshenin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接