Как использовать Google Cloud Functions & Firestore в качестве менеджера задач - PullRequest
1 голос
/ 01 мая 2020

Я использую Firestore для управления некоторыми распределенными задачами в Google Cloud. Каждая задача - это do c в базе данных со статусом и другими полями. У меня есть облачные функции, вызванные изменениями в документах задач. Экземпляры виртуальных машин также имеют схожие документы.

У меня есть одно забавное облако c startReadyTasks, которое проверяет все задачи и виртуальные машины, находит выполняемые задачи и отправляет их экземплярам или запускает для них экземпляры. Моя проблема в том, что, поскольку она вызывается обновлением c, эта функция может запускаться несколько раз одновременно, что означает, что я запускаю слишком много экземпляров или запускаю задачи несколько раз.

Итак, я хочу облачную функцию, которая может запускать только один экземпляр за раз , и я знаю, что это не то, для чего она предназначена, а то, что мне нужно. Лучший план, к которому я могу придумать, это:

  • Когда задача или виртуальная машина создается или изменяет состояние, облако удовольствия c обрабатывает эти наборы специального check-requested do c в дБ к 1.
  • Я запускаю startReadyTasks триггер при изменении на check-requested, и когда он переходит на 1, он запускает все свои проверки, запускает экземпляры, отправляет готовые задачи для запуска. Затем, когда это сделано, он устанавливает check-requested в 0.
    • 1-> 1 переходы не вызывают другого триггера, поэтому я буду запускать только один за раз.

Это может пропустить запросы во время работы, поэтому он не идеален. Кроме того, вы не должны писать в тот же Firestore делать c больше, чем 1x / se c. Есть ли какие-нибудь умные идеи или другие инструменты инфраструктуры Google, которые я могу использовать для этого? Паб / к югу? Желательно что-то не слишком сложное; Похоже, что это должно быть простой задачей.

(Я пробовал мьютекс на основе Firestore, но это вызывает проблемы конфликта - слишком много транзакций на одном и том же c.)

...