Быстрое создание облачных задач с помощью Cloud Task, Cloud Functions и GAE

Я использую App Engine, чтобы инициировать создание нескольких облачных задач на основе элементов в списке:

function_url="https://us-central1-myproject.cloudfunctions.net/some-cloud-function"

someTasks = [
{'id': 'task-1'},
{'id': 'task-2'},
{'id': 'task-3'},
...
{'id': 'task-1000'},
]

В настоящее время задачи создаются с использованием:

Parallel(backend='threading', n_jobs=100)(
        delayed(create_document_task)(function_url=function_uri, data=task) for task in someTasks 
                    )

Приведенный выше код создает задачи параллельно и инструктирует очередь задач направить полезную нагрузку в эту конкретную облачную функцию.

Правильно ли делать это параллельно для быстрого создания задач?


person Ari    schedule 26.11.2019    source источник
comment
Нет, вы должны выполнить пакетную отправку, чтобы уменьшить количество вызовов API. См. stackoverflow.com/a/34457147/136598   -  person gaefan    schedule 26.11.2019
comment
В старые очереди задач App Engine добавлялось асинхронное пакетное добавление, как упомянуто выше. Однако я не рекомендую использовать старую функциональность, особенно если вы перешли на Cloud Tasks.   -  person Averi Kitsch    schedule 26.11.2019
comment
@AveriKitsch - это старый метод? Если не так, знаете ли вы, как пакетно добавлять задачи в очередь?   -  person Ari    schedule 27.11.2019


Ответы (1)


- I am posting this as an answer, due to the amount of text not fitting in a comment.

Похоже, что вышеупомянутый (в комментариях) метод:

  • Очередь («someQueue»). Add_async (задачи)

действительно старый метод. Этот метод реализован в API REST очереди задач (v1), чтобы асинхронно добавить задачу или список задач в очередь задач.

Однако, как указано здесь, очередь задач App Engine REST API (v1) был отклонен с 20 февраля 2018 г. Отдельный продукт Cloud Tasks предоставляет REST API, который можно использовать для добавления задач из стандартной среды выполнения App Engine второго поколения, любой из гибких сред выполнения App Engine или даже полностью вне App Engine.

Этот API не включает функцию add_async (). Более конкретно, здесь и здесь подтверждается, что функция добавления задачи в очереди асинхронно, поскольку пользователи SDK App Engine имеют возможность сделать НЕ является доступной функцией через Cloud Tasks API.

Тем не менее, когда необходимо добавить большое количество облачных задач, например миллионы или миллиарды, может быть полезен шаблон двойной инъекции.

Для реализации этого сценария вам необходимо создать новую очередь инжектора, одна задача которой будет содержать информацию для добавления нескольких (100) задач из исходной очереди, которую вы используете. На принимающей стороне этой очереди инжектора будет служба, которая выполняет фактическое добавление намеченных задач в вашу исходную очередь. Хотя добавление задач в эту службу будет синхронным и будет выполняться по принципу «1 на 1», она предоставит вашему основному приложению асинхронный интерфейс для массового добавления задач. Таким образом, вы можете преодолеть ограничения синхронного добавления задач 1 на 1 в вашем основном приложении.

Обратите внимание, что рекомендуется использовать шаблон 500/50/5 добавления задачи в очередь, чтобы избежать любых перегрузок (очереди / цели).

Поскольку я не нашел примеров этой реализации, я отредактирую ответ, как только найду его.

Надеюсь, это поможет.

person Artemis Georgakopoulou    schedule 27.11.2019
comment
Спасибо, это было действительно информативно. В общем, похоже, что моя первоначальная идея движется в правильном направлении. Но вместо этого я должен сделать это сервисом, который может регулировать и принимать пакет задач, которые должны быть созданы из исходного списка / очереди задач, но как услуга он также будет масштабироваться в зависимости от количества задач в исходная очередь / список? - person Ari; 27.11.2019
comment
1/2 - Да. Очередь обслуживания / инжектора может быть ускорена с течением времени, например, начать с 5 TPS, а затем увеличивать на 50% каждые 5 минут. Обратите внимание, что при масштабировании более 500 TPS вы должны увеличивать трафик не более чем на 50% каждые 5 минут. Рекомендуется следовать шаблону добавления задач 500/50/5 во избежание перегрузок очереди / цели. - person Artemis Georgakopoulou; 28.11.2019
comment
2/2 - Кроме того, если задачи создаются приложением App Engine, вы можете использовать разделение трафика App Engine (Standard / Flex) для сглаживания увеличения трафика. Это и эта ссылки могут быть полезны для понимания сценария. - person Artemis Georgakopoulou; 28.11.2019