在我的应用中,我需要在事件发生时向大量用户发送电子邮件。我想逐渐发送这些电子邮件,而不是一次性发送。为了清楚地解释,假设我需要向10,000个用户发送电子邮件。
我目前使用最大速率为1个任务/秒的任务队列执行此操作。我批量排队10,000个任务,电子邮件以1 /秒的速率发送。
我想将此更改为使用ETA执行任务,而不是将任务队列限制为最大速率。从概念上讲,它将是这样的(除了任务提交将被批处理):
now = datetime.utcnow()
for i, email in enumerate(email_list):
eta = now + datetime.timedelta(seconds=i)
deferred.defer(send_email, email, _eta=eta)
在实施这样的改变之前,我希望GAE能够有效地做到这一点。
如果我在任务队列中有10,000个任务,每个任务队列都有不同的ETA,那么GAE任务队列是否能够有效地监视所有任务并在适当的时间大约启动它们(精确的ETA并不重要)?我不知道谷歌使用什么算法。
编辑:
想象一下,如果您在一天内插入十亿个任务,每个任务都有一个ETA。 GAE如何监控这些任务以确保它们在正确的时间被解雇?以某个时间间隔(例如,每分钟)轮询所有任务将是一个可怕的解决方案。也许GAE使用某种优先级队列。能够确信GAE已经实现了一种可以通过ETA扩展许多任务的算法,这将是一件好事。
答案 0 :(得分:1)
根据陈述的daily quota of 10 billion tasks,人们会认为他们应该能够处理10,000个:)
在我目前的项目中,我还发送了大约10,000封电子邮件(SendGrid),其中包含任务& _eta
(虽然分批25个)到目前为止工作得很好......
答案 1 :(得分:1)
在当前的基础架构中,当吞吐量明显低于配置的速率时,逻辑可能会有点批量。队列提前准备任务5s,但如果在给定的5s窗口中没有任务,处理可能会变慢。
它应该可以正常工作,但是你可能会看到一个延迟模式,最多20秒后爆发。
在总吞吐量为每天1B任务的情况下,您可能希望以大约300个任务/秒/队列的速率拆分以运行超过40个队列。如果速度稳定,延迟就不常见了。