#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. Неплохо для некоторых простых случаев, но не очень хорошо для вас, поскольку вам придется настраивать много подписок.