При развертывании Invalidate Firebase кеш для облачной функции Google - PullRequest
9 голосов
/ 10 июня 2019

Я недавно внедрил SSR с облачными функциями и хостингом Firebase.

Когда JS-пакет создается, он получает суффикс разрыва кэша (main.1.js).

Внутри моей функции у меня есть следующий фрагмент кода для кэширования результатов облачной функции

res.set('Cache-Control', 'public, max-age=300, s-maxage=300');

Во время развертывания я сначала развертываю хостинг, а затем функцию облака

firebase deploy --only hosting:production && gcloud functions deploy ssr --runtime nodejs8 --trigger-http --source dist/server

При развертывании хостинга Firebase main.1.js заменяется main.2.js.

Из-за разрыва кэша файл теперь отличается (main.2.js), но из-за того, что облачная функция кэшируется еще 5 минут - я получаю ошибки при посещении веб-сайта (потому что main.1.js, на который ссылается кэшированная версия функции, больше не доступен).

Как бы вы исправили такую ​​проблему? Могу ли я иметь два активных развертывания и активировать одно за другим?

1 Ответ

4 голосов
/ 16 июня 2019

Заголовок элемента управления кешем public, max-age=300, s-maxage=300 сообщает любой стороне, обрабатывающей запрос (в основном браузер пользователя и сервер CDN Google, но также может быть, например, прокси-сервером, используемым пользователем), как кэшировать запрос. С вашей конфигурацией оба кэшируют файл в течение 5 минут. Вы не можете изменить это поведение, так как нет способа аннулировать кэш сервера CDN, а браузер также не знает о вашем развертывании, и даже если он получит уведомление и перезагрузит его, он получит тот же устаревший файл из CDN.

Я не совсем понимаю ваш вариант использования, но вот возможные решения:

  • Следите за тем, чтобы не удалять старые файлы, поэтому вам нужно сохранить любую версию main.x.js как минимум на время кеширования. Вы можете использовать Cloud Storage для загрузки файла при развертывании.
  • Добавить запасной вариант для клиента. Если main.1.js дает 404, увеличьте число и попробуйте main.2.js
  • Сохраняйте имя стабильным, например, main.js
  • Добавьте содержимое main.js в тело ответа облачной функции. Тем самым вы гарантируете, что ответ облачных функций и содержимое main.x.js будут кэшироваться вместе и перезагружаться вместе
  • Удалить заголовок кеша. Это приведет к увеличению трафика ваших функций и, следовательно, к увеличению затрат.
  • Также измените имя функции или ее переписывание при развертывании, чтобы вызвать пропадание кэша
...