Обеспечение надежности крупномасштабной платформы


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

Почему важна надежность

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

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

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

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

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

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

Сила правильного измерения

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

  • SLO (целевой уровень обслуживания) — это показатель надежности, к которому стремится наша команда (т. е. 99,999%).
  • SLI (индикатор уровня обслуживания) — это достигнутая надежность с учетом временных рамок (например, 99,975% в феврале прошлого года).
  • SLA (Соглашение об уровне обслуживания) — это надежность, которую наши потребители должны обеспечить и которую ожидают получить в заданный период времени (т. е. 99,99% в неделю).

SLI должен отражать доступность (отсутствие необработанных или отсутствующих ответов), отказоустойчивость (отсутствие ошибок обслуживания) и достигнутое качество (отсутствие непредвиденных ошибок). Поэтому мы определили наш SLI как «коэффициент успеха» успешных ответов по сравнению с общим количеством запросов, отправленных в службу. Успешные ответы — это те запросы, которые были отправлены вовремя и в нужной форме, т.е. связи, обслуживания или непредвиденных ошибок.

Этот SLI или коэффициент успеха собирается с точки зрения потребителей (т. е. клиентов). Намерение состоит в том, чтобы измерить фактический сквозной опыт, предоставляемый нашим потребителям, чтобы мы были уверены в соблюдении SLA. В противном случае возникнет ложное ощущение надежности, которое игнорирует все проблемы с инфраструктурой для связи с нашими клиентами. Подобно потребительскому SLI, мы собираем SLI зависимостей, чтобы отслеживать любые потенциальные риски. На практике все SLA зависимостей должны согласовываться с SLA службы, и с ними существует прямая зависимость. Неудача одного означает поражение всех. Мы также отслеживаем и сообщаем о метриках самой службы (т. е. сервера), но это не является практическим источником высокой надежности.

В дополнение к SLI каждая сборка собирает показатели качества, о которых сообщает наш рабочий процесс CI. Эта практика помогает строго обеспечивать контроль качества (т. е. покрытие кода) и сообщать о других значимых показателях, таких как соответствие стандарту кодирования и статический анализ кода. Ранее эта тема была раскрыта в другой статье, Создание микросервисов на основе производительности. Тщательное соблюдение качества играет важную роль, когда речь идет о надежности, потому что чем больше мы вкладываем в достижение отличных результатов, тем больше мы уверены, что система не выйдет из строя в неблагоприятных условиях.

В нашей команде есть два дашборда. Один обеспечивает полную видимость SLI потребителей и SLI зависимостей. Второй показывает все показатели качества. Мы работаем над тем, чтобы объединить все в единую панель, чтобы все важные для нас аспекты были объединены и готовы к отчету в любой заданный период времени.

Предвидеть неудачу

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

Еще один важный аспект, который следует предвидеть, — это все, что может улучшить связь. Это означает агрессивное отношение к низкой задержке для клиентов и подготовку их к очень высокому трафику с использованием методов управления кешем, побочных эффектов и высокопроизводительных политик для тайм-аутов, автоматических выключателей и повторных попыток. Эти методы применимы к любому клиенту, включая кэши, хранилища, очереди и взаимозависимые клиенты в HTTP и gRPC. Это также означает улучшение сигналов от служб и понимание того, что проверки работоспособности играют важную роль во всей оркестровке контейнеров. Большинство наших сервисов лучше сигнализируют о деградации в рамках обратной связи о проверке работоспособности и проверяют работоспособность всех критических компонентов, прежде чем отправлять сигналы работоспособности.

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

Оценка риска зависимости является важным инструментом для выявления потенциальных проблем с зависимостями. Это означает, что мы идентифицируем зависимости с низким уровнем SLI и запрашиваем согласование SLA. Эти зависимости требуют особого внимания на этапах интеграции, поэтому мы уделяем дополнительное время тестированию и тестированию, достаточно ли зрелы новые зависимости для наших планов. Одним из хороших примеров является раннее внедрение Roblox Storage-as-a-Service. Интеграция с этой службой требовала регистрации ошибок и периодических встреч по синхронизации для обмена выводами и отзывами. Во всей этой работе используется тег «надежность», чтобы мы могли быстро определить ее источник и приоритеты. Характеризация происходила часто, пока у нас не появилась уверенность, что новая зависимость готова для нас. Эта дополнительная работа помогла довести зависимость до требуемого уровня надежности, которую мы ожидаем обеспечить, действуя вместе для достижения общей цели.

Внесите структуру в хаос

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

Команда производит Ежемесячный отчет о надежности по каждой услуге это включает в себя все SLI, описанные здесь, любые заявки, которые мы открыли из-за надежности, и любые возможные инциденты, связанные с услугой. Мы настолько привыкли генерировать эти отчеты, что следующим естественным шагом будет автоматизация их извлечения. Выполнение этой периодической деятельности важно, и это напоминание о том, что надежность постоянно отслеживается и учитывается в нашем развитии.

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

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

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


Альберто — главный инженер-программист в команде идентификации учетных записей в Roblox. Он долгое время работает в игровой индустрии, имеет заслуги во многих играх AAA и платформах социальных сетей, уделяя особое внимание масштабируемым архитектурам. Теперь он помогает Roblox достичь роста и зрелости, применяя передовые методы разработки.



Источник: https://blog.roblox.com

Вам может понравиться...

Добавить комментарий