GCP: распределение трафика по регионам (активный-активный)

#google-cloud-platform #google-cloud-functions #google-cloud-storage #google-cloud-pubsub

#google-cloud-platform #google-cloud-функции #google-облачное хранилище #google-cloud-pubsub

Вопрос:

Я разрабатываю приложение, которое работает в нескольких регионах. скажем, R1, R2.

Файлы отправляются в многорегиональное облачное хранилище. ПОМЕСТИТЬ событие в корзину опубликует уведомление либо для прямого запуска облачной функции, либо для публикации в паблике / подтеме.

Я хочу, чтобы 80% обработки выполнялось R1, а 20% — R2.

Подход1: иметь 2 облачные функции: CF-R1, CF-R2. Как я могу гарантировать, что 80% уведомлений хранилища запускают CF-R1 и 20% запускают CF-R2?

Подход 2. создайте раздел / подраздел, который фиксирует уведомления из хранилища. Можно ли настроить CF-R1 и CF-R2 по теме, чтобы я мог разделить трафик?

Или любой другой подход для обработки этого сценария.

Комментарии:

1. Что вас беспокоит? Что вы хотите оптимизировать? Вам нужно развернуть функцию в 2 регионах? Для чего? Высокая доступность?

Ответ №1:

Подход 1. используйте балансировщик нагрузки с картами URL

Вы можете использовать облачную функцию или облачный запуск и использовать балансировщик нагрузки с картой URL (анонсированный в июне в этом сообщении в блоге — см. Документацию).

Если вы используете балансировщик нагрузки, вы можете отправлять уведомления балансировщику напрямую или через pubsub с помощью PUSH-подписки.

Обратите внимание, что балансировщик нагрузки — это отдельный продукт, и вы должны внимательно посмотреть на использование и цену.

Подход 2: несколько подписок на pubsub с фильтром

Я думаю, что второй вариант может быть жизнеспособным. Безумно для вашего случая, но это сработает.

У Google теперь есть бета-версия, позволяющая применять фильтр к теме pubsub при создании подписки.

Затем у вас может быть облачная функция (или облачный запуск), реагирующая на уведомления pubsub, которые они получают по своей собственной подписке.

С помощью этой бета-версии вы можете фильтровать сообщения по значениям (равно ==, не равно != и hasPrefix).

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

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

Если нет, я думаю, что в crc32 может быть достаточно информации для нужного вам фильтра. Но этот фильтр имеет ограничение в 128 символов, которое вы достигаете с помощью этого:

 hasPrefix(attributes.crc32,"A") OR hasPrefix(attributes.crc32,"B") OR hasPrefix(attributes.crc32,"C") OR hasPrefix(attributes.crc32,"D") OR hasPrefix(attributes.crc32,"E")
  

С приведенным выше фильтром у вас есть почти 10% возможных случаев CRC32. Неплохо для некоторых простых случаев, но не очень хорошо для вас, поскольку вам придется настраивать много подписок.