В этой подборке вопросы сгруппированы по формату «System Design», чтобы подготовку можно было вести от базовых тем к практическим задачам. В подборке чаще встречаются темы: backend, api, database.
При раздельном кешировании связанных данных можно получить несогласованный снимок: один ключ уже обновился, другой ещё содержит старое значение. Одинаковый TTL не обеспечивает атомарное обновление.
При создании заказа запишите сам заказ и событие OrderCreated в outbox в одной транзакции БД. Отдельный процесс публикует сохранённое событие в брокер и отмечает его отправку.
Для server-to-server взаимодействия с небольшими сообщениями подходят и REST, и gRPC. Размер данных сам по себе не определяет выбор; важнее контракты, клиенты, стриминг и эксплуатационная среда.
Кешируйте погоду по нормализованному городу, единицам измерения и нужным параметрам с допустимым TTL. При массовом промахе объединяйте обновление одного ключа, иначе 50k RPS обрушатся на источник.
Откат кода не исправляет уже записанные неверные данные. Сначала нужно остановить источник повреждения, определить затронутые записи и подготовить проверяемую процедуру восстановления с резервной копией.
Шардирование распределяет строки между несколькими независимыми узлами по ключу, чтобы масштабировать объём данных и нагрузку. Это отличается от репликации, где узлы хранят копии.
Outbox надёжно связывает изменение данных и будущую отправку события. Inbox помогает получателю не применять одно сообщение повторно. Оба паттерна особенно полезны при доставке at-least-once.
Feature toggle — переключатель поведения, отделяющий включение функции от выкладки кода. Для быстрого отключения значение читают из управляемой конфигурации, обновляемой без редеплоя.
Singleton может представлять общий сервис хоста, но плагины лучше связывать через явные интерфейсы, DI или события. Глобальный доступ к единственному объекту создаёт скрытые зависимости.
Можно вынести загрузку из БД в отдельный обновляющий компонент, а сервису чтения дать только кеш. TTL выбирают по допустимой давности данных и поведению при сбое обновления, а не автоматически ставят пять минут.
Монолит подходит для небольшой команды, меняющихся требований и задач без необходимости независимо масштабировать компоненты. Модульный монолит сохраняет единое развёртывание, но имеет явные внутренние границы.