Надёжность #
Надёжность - это обеспечение правильной работы системы в случае сбоев.
Сбои могут происходить на аппаратном уровне, уровне ПО и уровне оператора системы:
Аппаратные сбои наименее предсказуемы, носят скорее случайный характер, зачастую не зависят друг от друга (примеры - выход диска из строя, отключение электроснабжения)
Ошибки ПО имеют более стабильный, системный характер. Причиной возникновения могут быть, например, входные данные, к которым система была не готова в следствие разного рода допущений при разработке
Уровень оператора - про то, как пользователи пользуются системой.
Пример - баланс между валидацией данных:
- при слишком слабых ограничениях пользователь может просто отправить в систему данные, которые могут вызвать ошибку
- при слишком сильных - пользователь может попытаться обойти эти ограничения, если система не позволяет ему сделать то, что он хочет
Масштабируемость #
Масштабируемость - наличие стратегий поддержания работоспособности системы в случае роста нагрузки
Здесь речь идёт о том, что нужны какие-то характеристики, которыми можно описать нагруженность и производительность системы.
Производительность - какую нагрузку может выдержать данная конфигурация системы. Нагрузка - определённая метрика (например, rps).
Приводится пример Твиттера с лентой подписок. В качестве метрики выбраны процентили время отклика.
Процентиль - какой процент выборки имеет значение меньше порогового, а какой больше или равен (например, за определённое временное окно, или за последние 1000 наблюдений).
В масштабируемых системах есть возможность добавлять вычислительные мощности для поддержания надёжности работы при высокой нагрузке.
Удобство в сопровождении #
Удобство в сопровождении - со временем систему становится всё сложнее разрабатывать. Также системой сложнее становится пользоваться. Всё это снижает надёжность системы (ошибки ПО, ошибки оператора).
Важно, чтобы сложность системы зависела по возможности только от бизнес-логики. Простая логика должна быть написана просто. Сложная не должна усложняться сложным кодом.
Помогают хорошие абстракции, а также использование известных паттернов и методик проектирования систем