В этой подборке вопросы сгруппированы по формату «System Design», чтобы подготовку можно было вести от базовых тем к практическим задачам. В подборке чаще встречаются темы: backend, api, database.
При оркестрации сагой управляет явный координатор: он выдаёт команды и решает следующий шаг. При хореографии сервисы реагируют на события друг друга без единого управляющего процесса.
SemaphoreSlim координирует только потоки одного процесса. При нескольких экземплярах приложения каждый может одновременно пересчитать один и тот же отсутствующий ключ кеша.
Основные паттерны отказоустойчивости: timeout, ограниченные retry с backoff и jitter, circuit breaker, bulkhead, резервирование и контролируемая деградация.
Цены кешируют с ограниченным TTL и инвалидируют при изменении, а при оформлении заказа проверяют актуальные условия. Одновременный cache miss может вызвать лавину одинаковых запросов к БД.
Это сервис управления заявками на доставку: он хранит их жизненный цикл и координирует передачу курьеру, но не становится владельцем оплаты или складского остатка.
Объединяйте хранилища через операции над логическим ключом и данными, а не через имена SaveToFile/SaveToDB. Конкретные пути, подключения и протоколы остаются внутри адаптеров.
Разделение IConnection и IFile полезно для ISP, а виртуальные деструкторы позволяют безопасное удаление через интерфейсы. Но наличие абстрактных классов само по себе ещё не обеспечивает все SOLID-принципы.
Разделите файловые, базовые и сетевые операции на самостоятельные компоненты. Тогда изменение протокола сервера не потребует изменения класса, который отвечает за работу с локальным файлом.
Отделите владение открытым ресурсом от преобразований данных. Базовый файловый объект отвечает за open/read/write/close, а логирование, компрессия или шифрование добавляются через композицию и декораторы.
IOManager объединяет разные механизмы хранения и растёт при добавлении каждого нового источника. Полезно отделить бизнес-операции от файлового, сетевого и базового ввода-вывода.
Нарушение возникает, если клиент вправе ожидать рабочий Save или Read, а новая реализация принципиально этого не умеет. Лучше разделить интерфейсы чтения и записи и зависеть только от нужной возможности.