Мы используем стандартную среду 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);
в сервлете вызывается future.get (), который запускает код и обычно завершается примерно через 1-2 секунды.потом.Поэтому мы ожидаем, что к тому времени все задачи будут поставлены в очередь.
Мы настроили установку kibana для отслеживания задержек, возникающих между запуском сервлета и выполнением сервлета очередей.Большинство из них в порядке, но около 1% из них запускаются до 10 минут с опозданием (все метки времени составляют около 600 000 мс). Открытие https://console.cloud.google.com/cloudtasks при возникновении проблемы показывает отдельные задачи, находящиеся вочередь на указанное количество времени (7-10 минут), если возникнет проблема.
Забавно: запланированные задачи «обгоняют» одну проблемную задачу.Они просто выполняются менее чем за несколько секунд.Очередь в данный момент не максимальна, как вы можете видеть по нашим очень высоким настройкам очереди (пропускная способность).В основном выполняется только несколько задач (~ 5-10)
То, что мы ожидали, произойдет:
Все очереди задач, запланированные с помощью приведенного выше кода для запуска в течение секунд, а не 10 минут (что это за 10-минутный магический номер?)
Шаги для воспроизведения:
Запланируйте задачу, используя приведенный выше код.
Пожалуйста, ознакомьтесь с этим пояснительным отрывком из журнала.
Ссылка на ввод кода Google: https://issuetracker.google.com/issues/132135612