Маршрутизация видеотрафика в Азиатско-Тихоокеанском регионе с помощью etcd

Видеостриминговая платформа, обслуживающая восемь рынков Азиатско-Тихоокеанского региона, устранила повторяющуюся ошибку маршрутизации, перенеся региональные конфигурации в etcd. Время распространения изменений маршрутизации сократилось примерно до одной секунды. Редакторы теперь могут временно повышать приоритет музыкального пула на несколько часов, не меняя код, а платформа перестала направлять южнокорейских зрителей на поток из Токио.

Почему старый подход перестал работать

Каждый роутер считывал три значения для каждого запроса: пул трендов, языковой токенизатор и цепочку резервных вариантов (fallback chain). Эти значения определялись бизнес-решениями — продвижением нового артиста, реагированием на региональный сбой или тестированием алгоритма рекомендаций, — а не изменениями в коде.

Изначально при каждом развертывании вместе с приложением поставлялся JSON-файл с таблицей маршрутизации. Во время инцидента дежурный инженер отредактировал файл на одном узле, чтобы перенаправить трафик на резервный пул, но не обновил остальные семь узлов. Возник рассинхрон конфигураций (config drift): в восьми странах использовались разные таблицы, и не было единого источника, подтверждающего «истинные» данные. Баг, из-за которого зрители из Сеула попадали на поток из Токио, сохранялся, потому что код оставался прежним — различались только скрытые конфигурации.

Выбор etcd в качестве единого источника истины

Команда сравнила три варианта:

  • SQLite/MySQL — заставили бы каждый роутер постоянно опрашивать базу данных, что увеличило бы задержки или привело к лавине запросов.
  • Consul — надежный инструмент для обнаружения сервисов (service discovery), но платформе не требовались все его возможности mesh-сети.
  • etcd — хранилище «ключ-значение» с сильной согласованностью и примитивом watch, который уведомляет клиентов в момент изменения ключа.

Именно функция watch перевесила чашу весов. Вместо того чтобы каждый роутер постоянно спрашивал «изменилось ли что-нибудь?», роутеры находились в режиме ожидания, пока etcd не присылал обновление. Лишний сетевой трафик исчез, и каждый экземпляр узнавал об изменениях одновременно.

Паттерны для обеспечения безопасности системы

Сам по себе etcd не решал все риски. Инженеры добавили три дополняющих его паттерна:

  1. Leases (аренды) — редактор может установить временное повышение приоритета (например, увеличить вес пула K-pop на шесть часов). Срок аренды истекает автоматически, поэтому повышение исчезает без необходимости ручного отката.
  2. Compare-and-swap (CAS) — если два человека одновременно редактируют одну и ту же настройку, CAS выдает ошибку одному из них, предотвращая скрытую перезапись данных.
  3. Sidecar-процесс — PHP плохо справляется с длительными соединениями. Крошечный sidecar на Go на каждом узле отслеживает etcd и записывает снимок таблицы маршрутизации в файл в разделяемой памяти (/dev/shm). PHP считывает этот локальный файл, избегая сетевых задержек при обработке запроса.

Отказоустойчивость, заложенная в архитектуру

Новая архитектура включает несколько страховочных механизмов:

  • Чтение с нулевой задержкой — основной путь выполнения (hot path) в PHP считывает данные из локальной памяти, поэтому запросы никогда не зависают в ожидании удаленного хранилища.
  • Плавная деградация — если etcd выйдет из строя, роутеры продолжат использовать последнюю известную рабочую конфигурацию, что предотвратит внезапный сбой.
  • Надежные обновления — sidecar берет на себя логику переподключения и гарантирует, что ни одно изменение не будет пропущено, даже если соединение с etcd временно прервется.

Что изменилось на практике

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

Контраргумент: цена использования sidecar

Использование sidecar означает наличие второго процесса на каждом сервере и среды выполнения Go в стеке, ориентированном на PHP. Некоторые операторы беспокоятся о дополнительном потреблении памяти и необходимости мониторинга еще одного бинарного файла. На практике потребление ресурсов sidecar остается скромным, а выигрыш в надежности — особенно гарантия того, что PHP никогда не будет блокироваться на сетевом вызове — перевешивает эксплуатационные расходы.

На что обратить внимание в дальнейшем

Командам, управляющим мультирегиональными сервисами, следует отслеживать:

  • Метрики состояния etcd — уровень маршрутизации зависит от единого хранилища; следите за состоянием кворума и задержками.
  • Обработка истечения срока аренды — подбирайте время аренды в соответствии с бизнес-задачами; слишком длительные аренды оставляют устаревшие повышения приоритета в силе.
  • Масштабирование нагрузки watch — с ростом числа роутеров увеличивается количество соединений watch; планируйте емкость серверов etcd соответствующим образом.

Итог

Для любого сервиса, которому требуются быстрые и скоординированные изменения конфигурации в множестве регионов, примитивы watch, lease и transaction в etcd предлагают легковесную и строго согласованную альтернативу конфигурациям на основе файлов или тяжеловесным mesh-системам. Превращение конфигурации в push-ориентированное хранилище с механизмом самоочистки устранило целый класс инцидентов и обеспечило платформе контроль над логикой маршрутизации в режиме реального времени.