Проблема идемпотентности облачных функций - PullRequest
1 голос
/ 05 марта 2019

Я реализовал context.eventId, но теперь я столкнулся со следующей проблемой.Очевидно, я не ожидаю, что вызовы будут инициироваться в том же порядке или даже только один раз за действие, но, тем не менее, одно и то же событие, происходящее с интервалом в 10 секунд, кажется довольно плохим.

  1. Первый триггерв 17: 07: 33 (
  2. Второй запуск в 17: 07: 43 ( 10 секунд позже)
  3. Третий триггер в 17: 07: 54 ( 11 секунд позже)

Между тем же событием, которое сработало три раза (с интервалом в 10 секунд), другие транзакции имеютпроизошло также, поэтому, когда он в первый раз сработал, он сохранил, что eventId, а затем потерял его, потому что произошло другое событие. Затем то же самое событие сработало снова, через 10 секунд, которое, очевидно, не было помечено как дубликат, учитывая lastEventId был уже перезаписан предыдущими транзакциями (которые произошли в течение этого 10-секундного перерыва).

Как это возможно? Как мы можем обойти это? Для их обработки требуется всего ~ 150 мс, так что это не большойфайл функций which нужно много времени во время холодной загрузки.Он кэшировал глобальные переменные (firestore), он лениво загружает переменные, которые я использую в определенных функциях.В общем, это легкий файл функций.Только 250 строк кода с 9 функциями внутри одного и того же файла.

enter image description here

1 Ответ

1 голос
/ 05 марта 2019

Облачные функции дают хотя бы раз гарантии для выполнения фоновых функций.Это означает, что функция может выполняться несколько раз за одно событие.Хотя это не является распространенным явлением, это просто способ, которым масштабируемые системы справляются с потенциальными ошибками, когда несколько машин должны координировать и взаимодействовать асинхронно.

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

Общая проблема, которую нельзя избежать, это вызвать Проблема двух генералов в информатике.Вы можете прочитать об этом, чтобы лучше понять большую проблему.По сути, все компьютерные системы, в которых работают облачные функции, не могут на 100% надежно постоянно общаться друг с другом (из-за ошибок и потери данных), поэтому повторные попытки необходимы для обеспечения выполнения функции хотя бы один раз, что лучшечем никогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...