Я создаю конвейер приема данных с помощью Cloud Run. My Cloud Run API вызывается каждый раз, когда файл помещается в корзину GCS через Pub Sub. Мне нужно загрузить некоторые метаданные, которые содержат текст для данных, которые я принимаю. Эти метаданные изменяются нечасто. Я, очевидно, не хочу перезагружать его в память при каждом выполнении. Каков мой лучший вариант? То, что я смог исследовать до сих пор, это:
Опция 1
Вы также можете кэшировать объекты в памяти, если их повторное создание при каждом запросе службы требует больших затрат. Перемещение этого из логики запроса в глобальную область действия приводит к повышению производительности. https://cloud.google.com/run/docs/tips#run_tips_global_scope-java
В примере, приведенном по этой ссылке, функция HeavyComputation вызывается только один раз при холодном запуске? Что делать, если мне нужно время от времени перезапускать эту функцию при обновлении метаданных. Я также нахожу следующую информацию тревожной, поскольку она, кажется, говорит о том, что нет никакой гарантии, что другие экземпляры будут повторно использовать объект или нет.
В Cloud Run нельзя предполагать, что состояние службы сохраняется между запросами. Однако Cloud Run повторно использует отдельные экземпляры контейнера для обслуживания текущего трафика, поэтому вы можете объявить переменную в глобальной области, чтобы разрешить повторное использование ее значения при последующих вызовах. Невозможно заранее узнать, получает ли какой-либо отдельный запрос преимущество от этого повторного использования.
Вариант 2
Используйте что-то вроде Redis или Cloud Memory Store, которое обновляется облачной функцией каждый раз, когда происходят изменения. И все экземпляры облачного API извлекают метаданные из Redis. Будет ли это менее или более эффективным, чем вариант 1? Любые другие недостатки в этом?
Если есть другие лучшие способы сделать это, мне было бы очень интересно.
Обновление 1: я подумал об этом еще немного, и поскольку мои метаданные будут разными для каждого арендатора, и каждый вызов моего кода запуска в облаке будет принимать один файл для одного арендатора, было бы плохой идеей загружать все арендаторы. метаданные при каждом выполнении, даже если они кэшированы. Однако я мог бы запускать отдельные облачные прогоны внутри проекта каждого арендатора.