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

    Инженер фотосервиса 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. Еще немного о работе нашего провайдера виртуальной инфраструктуры:

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

    Comments 12

        –1
        btw, в первом же комменте речь идёт о гигабайтах. Мне доводилось иметь дела с сотнями мегабайт на диске, и единицами мегабайт памяти на той же 3.12. Не 93 год, но ещё прошлый век.

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

        Смешной афтор… ;-):
        … ну сырой тебе Go — не пользуйся.
        Пользуйся: BASIC, COBOL… проверено годами!
          0
          > Инженер фотосервиса Imgur Джейкоб Гринлиф

          В принципе, чтобы почерпнуть знания об отказоустойчивых системах, нужно бы читать не мнения сотрудников облачных сервисов, а пойти и почитать, скажем, публикации из операционной системы QNX…

            +4
            Мда. Я вотчдогов, кронов, которые убивают длинные запросы в базу и прочих костылей стыдился… А оказывается, надо было гордиться надо было.
              0
              А чего стыдиться? Записал в лог для последующего разбора ситуации и грохнул, чтобы система не повисла и тебе звонить не начали. Потом проблему исправил спокойно днем.
                0
                А еще надо понаставить вотчдогов которые следят за вотчдогами)
                  0
                  Всё зависит от масштабов. Если у вас система на миллионы компьютеров и соответствующее количество ресурсов и админов, то там и вотчдоги которые следят за вотчдогами которые следят за вотчдогами могут быть.
                  +2
                  Стыдиться надо, когда у Вас что-то не работает, а Вы узнаете об этом от пользователей. Лучше перебдеть, чем недобдеть.
                  0
                  Мне еще понравилось — в Амазоне(?) вся инфраструктура построена на сервисах и чтобы убедиться, что все сделано отказоустойчиво и надежно, специальный сервис Crazy Monkey в рабочее время ходит по машинам и случайным образом изредка гасит одну из них :))
                    0
                    По-моему специальный демон убийца медленных SQL запросов это всё-таки вредный совет. Если уничтожить «долгий» запрос, то та задача, которую выполнял скрипт, выполнена не будет. Страница не покажется, скрипт не сделает свою работу и т.д. Это скорее закапывание проблемы глубже, а не отказоустойчивость. По крайней мере, нужно куда-то логировать такие запросы и пытаться избежать их появления в будущем.
                      0
                      В слоу лог вообще полезно заглядывать. Благо в 5.6 это можно прямо из бд смотреть

                    Only users with full accounts can post comments. Log in, please.