Подавайте динамический контент с помощью Firebase Hosting/Functions в ЕС

Я хотел бы обслуживать приложение Next.js в Европе, используя возможности хостинга и функций Firebase.

Я понимаю из документа, что:

Если вы используете функции HTTP для предоставления динамического контента для Firebase Хостинг, вы должны использовать us-central1

и что

Firebase Hosting поддерживает облачные функции только в us-central1

Это довольно ясно: вы должны использовать us-central. Но моя главная цель - Европа..

Я прочитал следующее в руководстве по расположению облачных функций:

Для HTTP и вызываемых функций мы рекомендуем сначала установить функции в регионе назначения или ближайшем к наиболее ожидаемому находятся клиенты, а затем измените исходную функцию на перенаправить свой HTTP-запрос на новую функцию (они могут иметь одинаковые имя). [Solution 1] Если клиенты вашей функции HTTP поддерживают перенаправления, вы можете просто изменить исходную функцию, чтобы она возвращала Статус перенаправления HTTP (301) вместе с URL-адресом вашей новой функции. [Solution 2] Если ваши клиенты плохо справляются с редиректами, вы можете прокси-запрос от исходной функции к новой функции с помощью инициирование нового запроса от исходной функции к новой функция. Последним шагом является обеспечение того, чтобы все клиенты вызывали новая функция.

Я выделил то, что кажется двумя решениями моей первоначальной проблемы:

Решение 1

  • Иметь функцию us-central1, которая отправляет перенаправление 301 на https://europe-west1-[myProject].cloudfunctions.net/[myEuropeanFunction]
  • Иметь функцию europe-west1, которая выполняет эту работу (в моем случае обслуживать приложение Next.js).
  • С удовольствием пользуюсь Firestore, расположенным в europe-west1

Это будет работать только в том случае, если клиенты функции HTTP поддерживают перенаправления. В моем случае все нормально: все браузеры поддерживают перенаправление.

exports.nextServer = functions
    .https
    .onRequest((req, res) => {
        res.set('location', 'https://europe-west1-<my-project>.cloudfunctions.net/nextServerEurope');
        res.status(301).send()
    });

exports.nextServerEurope = functions
    .region('europe-west1')
    .https
    .onRequest((req, res) => {
        return server.prepare().then(() => nextjsHandle(req, res));
    });

Проблема с этим решением заключается в том, что URL-адрес меняется в браузере на https://europe-west1-.cloudfunctions.net/nextServerEurope: -/

Решение 2

  • Иметь функцию us-central1, которая инициирует новый/прокси-запрос к функции europe-west1.
  • Используйте ту же функцию europe-west1, которая выполняет эту работу (в моем случае обслуживайте приложение Next.js).
  • Все еще с удовольствием пользуюсь Firestore, расположенным в europe-west1

По прокси-запросу (как предлагается в руководстве) это будет означать использование библиотеки, такой как axios, я полагаю. Я знаю, что есть некоторые библиотеки для выполнения прокси-запросов, доступных и для node.

Однако с этим решением первая проблема, о которой я могу подумать, — это ненужная задержка, вызванная передачей конечной точки us:

client -> us endpoint -> eu endpoint -> do stuff -> us endpoint -> client


Что касается выставления счетов, мне интересно, как это повлияет ..

Я знаю, что две службы из разных регионов, звонящие друг другу, могут увеличить задержку и биллинг (исход).

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

Для меня неясно, какова будет дополнительная стоимость выставления счетов со вторым решением (помимо стоимости задержки): будет ли трафик для запроса прокси от нас к ЕС дорогим?


Обернуть:

  • Решение 1 простое, но приводит к непрозрачному перенаправлению
  • Решение 2 выглядит нормально, но требует дополнительного HTTP-запроса, что приводит к дополнительной задержке (и потенциально дополнительному выставлению счетов) В конце концов, оба решения кажутся не совсем подходящими.

Поэтому мой вопрос:

Как вы обслуживаете динамический контент в Европе с помощью хостинга и функций Firebase?

Вы на самом деле пробовали что-то из того, что здесь предлагали? Я подозреваю, что они не будут работать так, как вы ожидаете, по разным причинам. Я предлагаю вам вообще не использовать облачные функции. Вместо этого используйте Cloud Run.

Doug Stevenson 15.12.2020 17:12

Да, я сделал. Первое решение нежизнеспособно (как объяснено). Второе решение просто неправильно с точки зрения архитектуры (я не эксперт, но мне кажется неправильным размещать прокси-запрос для обхода ограничения). Вы можете найти множество руководств по развертыванию Next.js в облачных функциях, поэтому мой вопрос. Но, в конце концов, с таким ограничением, кажется, это относится только к американской аудитории. Немного удивлен/озадачен этим ограничением. Вот и все. Я проверю Cloud Run. Спасибо, в любом случае

Binajmen 16.12.2020 09:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
737
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хостинг Firebase поддерживает только облачные функции в Us-Central, как вы упомянули и как указано в Официальной документации Firebase Hosting.

Я создал запрос функции в Public Issue Tracker, чтобы поддерживать другие регионы при использовании Firebase Hosting с облачными функциями. Обратите внимание, что нет ETA, когда это будет реализовано.

Поэтому, как предлагает @Doug Stevenson, вместо этого вы можете использовать Firebase Hosting with Cloud Run для обслуживания своего динамического контента.

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

Binajmen 16.12.2020 17:09

При доступе к запросу функции в Public Issue Tracker выдает ли он какую-либо ошибку или что-то в этом роде?

Nibrass H 16.12.2020 17:11

Теперь вы должны увидеть запрос функции, так как теперь он общедоступен. Пожалуйста, попробуйте еще раз, чтобы получить к нему доступ.

Nibrass H 17.12.2020 12:00

Обратите внимание, что эта функция будет работать только с обновленным интерфейсом командной строки Firebase, так как было внесено несколько изменений в развертывание.

Lucem 14.11.2022 14:13

Лишь бы обновить. По состоянию на август 2022 г.

Наконец, проблема с задержкой может быть легко решена на данный момент.

Перезапись Firebase Hosting на CF3 может быть выполнена для любого CF3. регион, а не только сша-центр1.

Ссылка: Билет запроса функции

Другие вопросы по теме