В этой подборке вопросы сгруппированы по формату «System Design», чтобы подготовку можно было вести от базовых тем к практическим задачам. В подборке чаще встречаются темы: backend, api, database.
Маршрутизируйте события одного пользователя в одну упорядоченную partition и обеспечьте последовательную обработку этого ключа. Масштабирование происходит по разным ключам, а не внутри одной последовательности.
Нельзя незаметно отказаться от E2EE ради поиска: это меняет модель доверия и обещания пользователю. Сначала нужно определить приоритеты и рассмотреть поиск на клиенте или локальный индекс.
Проверка и резервирование ключа не атомарны: оба запроса могут увидеть отсутствие записи до завершения другого. Потокобезопасность отдельной операции словаря не защищает весь сценарий.
TTL-lock может истечь во время паузы GC, после чего старый worker продолжит работу одновременно с новым. Для защиты ресурса нужен fencing token или проверка версии, а не только продление TTL.
Для тысячи товаров начните с модульного backend и реляционной БД: каталог, цены, остатки, корзина и заказы. Микросервисы не нужны только из-за частых обновлений.
Сначала проверьте контракт старых клиентов и требования к надёжности: ссылка на ещё не созданный файл вводит в заблуждение, а десятиминутная BackgroundTasks-задача может потеряться при рестарте.
Сначала определите, нужен ли глобальный порядок или достаточно порядка для одного заказа, пользователя либо другого ключа. Обычно выбирают упорядочивание по ключу и явные версии событий.
Постройте потоковый конвейер с адаптером источника, ограниченной очередью, пулом загрузчиков, парсерами и пакетной записью. Лимит 1000 должен действовать на все активные запросы вместе.
Резерв скидки должен иметь срок и состояния. При подтверждённом отказе или истечении резерва его освобождают; при неопределённом результате оплаты сначала уточняют статус у платёжной системы.
Выделите транспортный слой, application-сценарий, доменную модель и инфраструктуру. Заказ хранит бизнес-инварианты, а сценарий координирует репозитории, транзакцию и внешние действия.
История должна храниться вне памяти WebSocket-процесса — в долговечной БД. После переподключения клиент запрашивает сообщения после последнего подтверждённого номера или курсора.
Сначала найдите источник лишних записей: compaction, вторичные индексы, большие документы или частые обновления одного ключа. Решение зависит от движка, а не от ярлыка NoSQL.