Pull to refresh
0
1cloud.ru
IaaS, VPS, VDS, Частное и публичное облако, SSL

Как писать высокодоступный код

Reading time 3 min
Views 29K
Инженер фотосервиса Imgur Джейкоб Гринлиф (Jacob Greenleaf) опубликовал в блоге на Medium материал, в котором изложил несколько советов по созданию высокодоступного кода для отказоустойчивых систем. Мы решили взглянуть на экспертное мнение.


/ фото Epicantus

Джейкоб работает в Imgur уже больше двух лет. Его опыт позволяет выделить ряд базовых подходов, которые помогают создавать отказоустойчивые системы. Один из таких подходов заключается в понимании адекватных рамок работы системы. Например, использование бесконечной блокировки или все-таки добавление таймаута при соединении с сервисом по сети.

Так, в сервисе Imgur есть задача cron, которая называется «убийцей длинных запросов» — она сканирует активные зарпосы в MySQL, которые выполняются от имени запросов пользователей, и проверяет, как долго они выполняются, убивая те, что превышают заданный порог.

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

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

Для создания софта с высокими требованиями по части доступности часто используется Erlang. В нем есть паттерн контроля (supervisors): каждая задача, которую выполняет программа, структурирована таким образом, чтобы работать под надзором контролирующего процесса (супервизора). Если супервизор обнаруживает неожиданное завершение задачи, он ее перезапускает (как в предыдущем правиле) с известного безошибочного состояния.

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

Зачастую помогает перебор базовых настроек на уровне операционной системы, как и произошло в случае с Pinterest, которая выявила влияние версии ядра Linux на оптимизацию работы оборудования. В рамках этого анализа было проверено более 60 различных тестовых конфигураций.

DevOps-сообщество сходит с ума по CoreOS и легким контейнерам «в стиле LXC». Однако когда Джейкоб Гринлиф попробовал с ним работать, выяснилось, что в компоненте ядра (FleetD) содержался баг, затрагивавший работу с планировщиком, который мог повлечь остановку работы системы. Гринлиф смог разобраться с проблемой после многих часов отладки, завершившейся в два часа утра. Новые технологии часто могут содержать никому еще неизвестные ошибки и причины для сбоя.

Кроме того, у более новых проектов есть общая черта — часто они слишком сырые для работы в продакшене. Например, у Golang нет официального отладчика, а альтернативный открытый отладчик появился всего несколько месяцев назад. Также инструменты мониторинга и трассировки языка Go ни в какое сравнение не идут с Java JMX и Erlang.

P.S. Еще немного о работе нашего провайдера виртуальной инфраструктуры:

Tags:
Hubs:
+24
Comments 12
Comments Comments 12

Articles

Information

Website
1cloud.ru
Registered
Founded
Employees
31–50 employees
Location
Россия