Что важно знать
- Сначала требования и цифры, потом схема.
- Каждое решение — компромисс, его называют вслух.
- Точный подсчёт на миллиардах событий часто не нужен.
Короткие ссылки, уникальные идентификаторы, счётчики, топ запросов, лента, мессенджер и rate limiter.
Практика. Решить три задачи письменно за 45 минут каждую и сравнить с разбором.
Практика. Провести два пробных интервью по проектированию в роли кандидата и два — в роли интервьюера.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
Чтений в 100 раз больше записей: редирект из кэша за миллисекунды, код — base62 от уникального числа (счётчик с выдачей диапазонов или Snowflake), хранилище key-value с шардированием по коду.
Полный разборВарианты: автоинкремент (просто, но одна точка и угадываемость), UUIDv4 (без координации, но случайный — плохо для B-дерева), UUIDv7 / Snowflake (время в старших битах — почти упорядочены, без координации).
Полный разборНе делать UPDATE views = views + 1 на каждый просмотр: одна строка вирусного видео станет узким местом. События — в очередь, счётчики — агрегировать пачками в памяти и сбрасывать раз в секунды; показывать приблизительное значение.
Полный разборДве дорожки: быстрая приближённая — потоковые агрегаторы считают топ по минутным окнам (count-min sketch + куча или Space-Saving) и сливают в топ за час; медленная точная — пакетный подсчёт по сырым событиям для дня и отчётов.
Полный разборТочный подсчёт требует хранить все уникальные id. HyperLogLog оценивает их число с ошибкой ~0,8%, используя 12 КБ на любое количество — от тысячи до миллиардов.
Полный разборГлавный выбор — когда собирать ленту. Fan-out on write: при публикации положить id поста в ленты всех подписчиков — чтение мгновенное. Fan-out on read: собирать при открытии из постов подписок — дорогое чтение. На практике гибрид: обычные авторы — на записи…
Полный разборКлиенты держат постоянное соединение (WebSocket) с шлюзами; сообщение пишется в хранилище, шардированное по chat_id, получает порядковый номер в чате и доставляется онлайн-участникам через шлюзы, офлайн — пушем.
Полный разборСостояние лимита — в общем быстром хранилище (Redis), проверка и списание — атомарно одним скриптом (Lua) или командой. Лимитер — в шлюзе или сайдкаре, до бизнес-логики.
Полный разборПосле собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.