GCP文档 - 任务队列bucket_size和评分

时间:2017-11-09 19:10:14

标签: google-app-engine google-cloud-platform gcp

我在这里阅读了很多关于Google Task的文章和答案,我的疑问是"率"和" bucket_size"行为。

我阅读了这份文件: https://cloud.google.com/appengine/docs/standard/java/configyaml/queue

该片段是:

  

配置最大并发请求数

     

如果不使用默认的max_concurrent_requests设置   够了,你可以改变max_concurrent_requests的设置,   如下例所示:

     

如果您的应用程序队列的速率为20 / s且存储桶大小为40,   该队列中的任务以20 / s的速率执行,并且可以突发到40 / s   简要介绍。如果任务延迟相对较低,这些设置可以正常工作;   但是,如果延迟显着增加,您将最终处理完毕   并发任务明显增多。这个额外的处理负载可以   消耗额外的实例并减慢您的应用程序。

     

例如,假设您的正常任务延迟为0.3   秒。在此延迟时间内,您最多可处理约40个任务   同时。但如果您的任务延迟增加到5秒,那么您   可以轻松地同时处理100多个任务。这种增加   强制您的应用程序使用更多实例来处理额外的操作   任务,可能会减慢整个应用程序和干扰   用户请求。

     

您可以通过将max_concurrent_requests设置为a来避免这种可能性   价值较低。例如,如果将max_concurrent_requests设置为10,   当延迟为0.3时,我们的示例队列维持大约20个任务/秒   秒。但是,当延迟增加超过0.5秒时,这就是   设置限制处理速率以确保不超过10   任务同时进行。

     

队列:

     

#将最大并发请求数设置为50

     

- name:optimize-queue
    率:20 / s
    bucket_size:40
    max_concurrent_requests:10

我知道队列的工作原理如下:

存储桶是确定执行任务量的单位。

费率是每个期间执行的桶数。

max_concurrent_requests是可以同时执行的最大值。

这个片段可能很奇怪:

  

但如果您的任务延迟增加到5秒,您可以轻松拥有   一次处理超过100个任务。这种增加迫使你的   应用程序消耗更多实例来处理额外的任务,   可能会减慢整个应用程序并干扰   用户请求。

想象一下,没有设置max_concurrent_requests。 对我来说,执行100多个任务是不可能的,因为bucket_size是40.对我来说,低任务会影响任务等待空桶的时间。

为什么文档说任务可以超过100?

如果桶是40,可以同时运行40多个?

修改

只是执行了所有任务,或者如果某个存储桶在下一个速率下空闲,那么存储桶是否会被填满? 例: 正在执行40个桶。 1桶完成。 想象一下,每个桶花费超过0.5秒,一些桶超过1秒。 当1个桶空闲时,这将在下一秒填满或者桶在等待桶再次填满之前等待所有任务完成?

1 个答案:

答案 0 :(得分:2)

您更精确地定义了铲斗尺寸in the doc,但想到它的一种方法是作为一种初始爆破限制。

根据您在问题中提供的参数,我了解它的运作方式:

  • bucket_size:40
  • 率:20 / s
  • max_concurrent_requests:10

在第一秒(t1)中,40个任务将开始处理。同时,20个令牌(基于rate)将添加到存储桶中。因此,在t2处,将准备20个任务以进行处理,并且将另外20个令牌添加到桶中。

如果没有max_concurrent_setting,则这20个任务将开始处理。如果max_concurrent_setting为10,则不会发生任何事情,因为已经有超过10个进程在使用。

App Engine将继续以20 / s的速率向存储桶添加令牌,但前提是存储桶中有空间(bucket_size)。一旦桶中有40个令牌,它将停止,直到某些运行过程完成并且有更多空间。

在完成40个任务的初始突发之后,一次执行的任务不应超过10个。