Я развертываю облачные функции Firebase, чтобы прослушивать изменения в нашем FireStore посредством непрерывного развертывания.
Я могу только найти способ активировать повторные попытки вручную. Что противоречит нашему подходу cd.
Глядя на обычный облачные функции gcp, флаг повторной попытки может быть задан при развертывании. Но я не могу найти аналогичную опцию в интерфейсе firebase-cli или firebase-functions (2.1.0)
Любые подсказки о том, как решить эту проблему? Карстен
В настоящее время нет аналогичного варианта развертывания с использованием интерфейса командной строки Firebase.
Над этим работает команда Firebase, так что следите за обновлениями.
Вы можете включить повторные попытки в функциях Firebase вручную с помощью GCloud Console. Программные повторные попытки функций на основе триггера были добавлены в firebase-functions
3.10.0 (см. список изменений и связанный пул реквест).
Поскольку это не совсем очевидно из PR или документации, вот краткий пример синтаксиса:
export const myFirebaseFunc = functions
.runWith({
failurePolicy: {
retry: {},
},
memory: '512MB',
timeoutSeconds: 60,
})
.firestore.document('/path/to/some/doc')
.onCreate(async (snap, context) => {
/* do stuff */
})
На момент написания этой статьи казалось, что политика отказа просто включена или выключена. Таким образом, это эквивалентно
export const myFirebaseFunc = functions
.runWith({
failurePolicy: true,
memory: '512MB',
timeoutSeconds: 60,
})
.firestore.document('/path/to/some/doc')
.onCreate(async (snap, context) => {
/* do stuff */
})
Некоторые предостережения:
Вам также придется выполнить развертывание с помощью --force
Вы можете разрешить повторные попытки только для триггерных функций, а не для функций, вызываемых http.
Было бы идиотизмом не встроить некоторые гарантии. Максимальный срок действия политики повторных попыток составляет 7 дней, и она оплачивается так же, как и любой другой вызов функции, поэтому, если у вас есть какая-то необработанная ошибка, она может повторяться в течение целой недели. Вы можете использовать context.eventTimestamp
, чтобы узнать, когда примерно началась первая попытка.
Прочитайте это: https://firebase.google.com/docs/functions/retries и убедитесь, что ваша функция в идемпотенте.
Также было трудно определить, что нужно вернуть, чтобы принудительно повторить попытку или избежать повторной попытки. Запущенные функции Firebase должны возвращать обещание. (см. этот видео)
Функция Firebase с повторными попытками повторит попытку, если:
Это означает, что если вы столкнетесь с ошибкой, которая, как вы знаете, в конечном итоге не разрешится при повторной попытке (т.е. вы хотите остановить выполнение функции и не повторять попытку), вы можете вернуть Promise.resolve({message: 'some message'});