Каков наилучший размер сегмента для очереди задач, заполненной многими отложенными задачами в Google App Engine?
Мое приложение Google App Engine добавляет большое количество отложенных задач в очередь задач. Задачи планируется запускать каждые х секунд. Если я правильно понимаю свойство размера сегмента b, высокое значение будет препятствовать запуску отложенных задач до тех пор, пока не будут добавлены задачи b. Однако существует требование, близкое к реальному времени, чтобы задачи выполнялись в соответствии с графиком. Я не хочу, чтобы задачи блокировались до тех пор, пока не будет достигнут размер корзины. Вместо этого они должны бежать как можно ближе к запланированному времени.
Чтобы поддержать этот вариант использования, я должен использовать размер корзины 1 и скорость 500 ( что является текущей максимальной скоростью)? Какие другие подходы существуют, чтобы поддержать это? Спасибо!
2 ответа
Размер корзины не препятствует выполнению задач по отдельности. Это играет другую роль.
Предположим, у вас есть пустая очередь со скоростью 500 задач в секунду, и несколько часов, когда никакие задачи не добавляются и не запускаются. Затем вдруг большое количество задач добавляются одновременно. Сколько из этих задач вы хотели бы начать немедленно? Установите этот номер в качестве размера вашего ведра. Например, с размером сегмента 1000, 1000 задач будут запущены немедленно (затем 500 в секунду в дальнейшем).
Как это работает? Контейнер пополняется на 500 токенов каждую секунду (скорость очереди), причем максимум равен размеру корзины. Когда есть задачи, доступные для запуска, они будут запущены, только когда корзина не пуста, и один токен будет удален из корзины при запуске каждой задачи.
Вы НЕ должны использовать очереди задач (TQ) для отложенных задач, которые важны для выполнения близко к реальному времени, используя допущение, что настройка корзины / скорости обеспечит высокую пропускную способность. В группах Google было несколько дискуссионных тем о нечастых задержках с продолжительностью запуска задач, составляющей минуты или более. Размер и скорость сегмента не будут влиять на это - ваши задачи TQ будут просто сидеть там, пока высокопроизводительный TQ простаивает. На сегодняшний день я никогда не видел объяснений от Google, почему это происходит. Опять же, если вы используете TQ для задач, близких к реальному времени, вы ДОЛЖНЫ обрабатывать в качестве исключения те редкие случаи, когда ваши задачи откладываются на несколько минут до запуска. (На самом деле я делаю это, и на меня это еще не повлияло, но для обработки результата = отложенная задача вам нужен код). Я очень надеюсь, что в процессе тестирования нового сервера / приложения Google найдет простой способ устранить эту невероятно большую проблему с помощью TQ (скрестив пальцы).