【问题标题】:GAE Task Queues with ETA and large number of tasks具有 ETA 和大量任务的 GAE 任务队列
【发布时间】:2016-11-10 22:19:40
【问题描述】:

在我的应用程序中,我需要在事件发生时向大量用户发送电子邮件。我想逐步发送这些电子邮件,而不是一次全部发送。为了解释清楚,假设我需要向 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 扩展许多任务,那就太好了。

【问题讨论】:

    标签: google-app-engine task-queue


    【解决方案1】:

    使用声明的daily quota of 10 billion tasks,人们会认为他们应该能够处理其中的 10,000 个 :)

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

    【讨论】:

    • 很高兴知道使用 _eta 可以很好地完成很多任务。我发现其他任务队列的事情没有按预期工作。
    【解决方案2】:

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

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

    如果总吞吐量为 1B 任务/天,您可能希望拆分为以大约 300 个任务/秒/队列的速率运行 40 个队列。以稳定的速度,延迟将是罕见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多