具有 ETA 和大量任务的 GAE 任务队列

GAE Task Queues with ETA and large number of tasks

在我的应用程序中,我需要在事件发生时向大量用户发送电子邮件。我想逐渐发送这些电子邮件,而不是一次全部发送。为了解释清楚,假设我需要向 10,000 名用户发送电子邮件。

我目前使用最大速率为 1 task/second 的任务队列执行此操作。我批量入队 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 并不重要)适当的时间启动它们次?我不知道 Google 使用什么算法。

编辑:

想象一下,如果您在一天内插入十亿个任务,每个任务都有一个 ETA。 GAE 将如何监控这些任务以确保它们在正确的时间被解雇?在某个时间间隔(例如,每分钟)轮询所有任务将是一个糟糕的解决方案。也许 GAE 使用某种优先级队列。如果有信心 GAE 已经实现了一种算法,该算法将通过 ETA 扩展到很多任务。

按照规定的 daily quota of 10 billion tasks,人们会认为他们应该能够处理其中的 10,000 个 :)

在我当前的项目中,我还发送了约 10,000 封带有任务的电子邮件 (SendGrid) 和 _eta(尽管以 25 为一批),到目前为止效果很好...

在当前的基础架构中,当吞吐量明显低于配置的速率时,逻辑可能会有点混乱。队列提前 5 秒准备任务,但如果在给定的 5 秒内没有任务,处理速度可能会变慢 window。

它应该可以正常工作,但您可能会看到长达 20 秒的延迟模式,然后是突发。

总吞吐量为 1B tasks/day,您可能希望以大约 300 tasks/sec/queue 的速率拆分为 运行 超过 40 个队列。以这种稳定的速度,延误是不常见的。