Когда вы думаете о бессерверности в GCP, подумайте о без сохранения состояния: ваш экземпляр можно удалить в любое время, и не все запросы будут попадать в один и тот же экземпляр Cloud Functions (то же самое с Cloud Run и App Engine).
Это распространенная ошибка. Мы использовали для развертывания рабочей нагрузки постоянную, а не временную виртуальную машину.
Итак, ваша проблема в том, что вы не можете полагаться на свои глобальные переменные. Во-первых, у вас есть 2 функции
- Одна запланирована каждые 10 минут
- Одна, которая принимает сообщения IoT
В любом случае, это никогда не будет тот же экземпляр, потому что это не тот же сервис (те же облачные функции). Итак, результат сегодня должен быть следующим: все устройства не работают, верно?
Чтобы решить эту проблему, вам нужно где-то сохранить свои данные.
- Сохраните данные в базе данных. Firestore или Datastore - хороший выбор, если количество устройств и сообщений ограничено: у вас есть бесплатные уровни 30 КБ записи в день (50 КБ чтения). Если у вас огромное количество устройств и сообщений, рекомендуется использовать BigTable. В середине вы можете использовать BigQuery для потоковой записи.
- Просто регистрирует обмен данными с устройством.
В журнале, как и в случае с базой данных, вам просто нужно запросить, какие устройства имеют отправил сообщение и сравните его с вашим списком устройств, чтобы определить, какие из них не работают.