我们正在将appengine标准环境(Java 8 // SDK版本1.9.73)与pushQueues一起使用。
这是我们的队列定义:
<queue>
<name>push-device-send-queue-2</name>
<rate>250/s</rate>
<bucket-size>50</bucket-size>
<max-concurrent-requests>1000</max-concurrent-requests>
<retry-parameters>
<task-retry-limit>3</task-retry-limit>
<task-age-limit>2m</task-age-limit>
</retry-parameters>
</queue>
这是我们的自动缩放参数:
<instance-class>F4</instance-class>
<automatic-scaling>
<min-idle-instances>1</min-idle-instances>
<max-idle-instances>1</max-idle-instances>
<min-pending-latency>200ms</min-pending-latency>
<max-pending-latency>3s</max-pending-latency>
<max-concurrent-requests>15</max-concurrent-requests>
</automatic-scaling>
队列由以下代码启动:
TaskOptions options = TaskOptions.Builder
.withUrl("/pushDeviceSendQueue")
.header("charset", "UTF-8")
.method(Method.POST)
.payload(gson.toJson(data));
queue.addAsync(options);
在servlet中调用future.get(),以开始代码并通常在1-2秒后完成。因此,我们希望届时所有任务都将排队。
我们设置了一个kibana安装程序,以监视在启动servlet和执行队列servlet之间发生的延迟。它们中的大多数都很好,但是大约有1%在最晚延迟10分钟后启动(所有ms时间戳大约为600,000 ms) 发生问题时打开https://console.cloud.google.com/cloudtasks会显示出现问题时,在队列中驻留指定时间(7-10分钟)的单个任务。
有趣:同时,计划任务“超越”了有问题的单个任务。它们仅在不到几秒钟的时间内执行。正如我们的很高的队列设置(吞吐量)所看到的,此时队列未达到最大值。几乎只有几个任务在运行(〜5-10)
我们期望发生的事情:
使用上述代码安排的所有任务队列将在秒而不是10分钟之内运行(这是10分钟的神奇数字是什么)
复制步骤:
使用上面的代码安排任务。
请参阅此说明性日志摘录。
链接到Google代码条目:https://issuetracker.google.com/issues/132135612