我的 Google App Engine 应用程序正在将大量延迟任务添加到任务队列中。这些任务计划每 x 秒运行一次。如果我正确理解了 bucket-size 属性b,那么高值会阻止延迟任务运行,直到添加b任务。但是,有一个接近实时的要求,即任务按计划运行。我不希望在达到桶大小之前阻止任务。相反,它们应该尽可能接近预定时间。
为了支持这个用例,我应该使用 1 的桶大小和 500 的速率(这是当前的最大速率)吗?还有哪些其他方法可以支持这一点?谢谢!
存储桶大小不会阻止任务单独运行。它扮演着不同的角色。
假设您有一个空队列,其速率为每秒 500 个任务,并且有几个小时没有添加或启动任何任务。然后突然间一下子增加了大量的任务。您希望立即开始这些任务中的多少?将此数字设置为您的存储桶大小。例如,桶大小为 1000,将立即启动 1000 个任务(然后每秒 500 个)。
这是如何运作的?存储桶每秒添加 500 个令牌(队列的速率),最大为存储桶大小。当有可启动的任务时,只会在桶不为空时启动,每启动一个任务就会从桶中取出一个token。
您不应该将任务队列 (TQ) 用于延迟任务,这些任务对于接近实时运行很重要,假设存储桶/速率设置将确保高吞吐量。在 Google 群组中有几个讨论主题是关于任务开始时间为几分钟或更长时间的罕见延迟。存储桶大小和速率不会对此产生影响——当您的高吞吐量 TQ 空闲时,您的 TQ 任务将简单地坐在那里。迄今为止,我还没有看到谷歌对为什么会发生这种情况的任何解释。同样,如果您将 TQ 用于接近实时的任务,您必须将任务在开始前延迟几分钟的罕见时间作为例外处理。(我实际上是这样做的,还没有受到负面影响,但是你必须有代码来处理结果 = 延迟任务)。