Глава 1. Надёжные, масштабируемые и удобные в сопровождении приложения

Надёжность #

Надёжность - это обеспечение правильной работы системы в случае сбоев.

Сбои могут происходить на аппаратном уровне, уровне ПО и уровне оператора системы:

  • Аппаратные сбои наименее предсказуемы, носят скорее случайный характер, зачастую не зависят друг от друга (примеры - выход диска из строя, отключение электроснабжения)

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

  • Уровень оператора - про то, как пользователи пользуются системой.

    Пример - баланс между валидацией данных:

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

Масштабируемость #

Масштабируемость - наличие стратегий поддержания работоспособности системы в случае роста нагрузки

Здесь речь идёт о том, что нужны какие-то характеристики, которыми можно описать нагруженность и производительность системы.

Производительность - какую нагрузку может выдержать данная конфигурация системы. Нагрузка - определённая метрика (например, rps).

Приводится пример Твиттера с лентой подписок. В качестве метрики выбраны процентили время отклика.

Процентиль - какой процент выборки имеет значение меньше порогового, а какой больше или равен (например, за определённое временное окно, или за последние 1000 наблюдений).

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


Удобство в сопровождении #

Удобство в сопровождении - со временем систему становится всё сложнее разрабатывать. Также системой сложнее становится пользоваться. Всё это снижает надёжность системы (ошибки ПО, ошибки оператора).

Важно, чтобы сложность системы зависела по возможности только от бизнес-логики. Простая логика должна быть написана просто. Сложная не должна усложняться сложным кодом.

Помогают хорошие абстракции, а также использование известных паттернов и методик проектирования систем