Нет ничего бесплатного - все сводится к тому, что является приемлемым компромиссом для достижения целей вашего бизнеса. Основными переменными являются:
- Стоимость
- Наличие
- Последовательность
- Живучесть (например, допуск раздела)
Отличная статья для чтения по теме.
Я полагаю, что хорошей метрикой было бы изучение кривой «затраты / пользователь» и попытка поддерживать ее в линейном прогрессе (предполагая, что приемлемая стоимость на пользователя является известным параметром: -)
Шаблоны проектирования действительно играют роль, но наиболее важной является общая архитектура. Можно было бы быть очень тщательным на уровне модуля, но как следствие пропущенные ограничения сетевого уровня и масштабируемость страдают.
В конце концов, я считаю, что нужно спросить себя: для типа сбоя X сколько «пользователей» может быть затронуто и как долго?
Где-то всегда будет SPOF (единая точка отказа), но можно спроектировать систему таким образом, чтобы этот SPOF перемещался ближе к конечным точкам (например, пользователям). Однако во многих случаях SPOF находится вне контроля приложения, например, сетевой POP недоступен.
Во всяком случае, я мог бы потратить часы на эту тему ...