300 человек одновременно открыли одну цитату. Что делает сер

Решал тестовое — написать витрину между каталогом цитат и читателями. Звучит просто, но условия как у взрослого проекта: 256 МБ RAM, 0.5 CPU, снимок каталога до 340 000 записей (110 МБ) одним запросом. Самая интересная часть — не код, а поведение под нагрузкой. ПРЕДСТАВЬ Виральная цитата. Автор с миллионом подписчиков написал твит. Ссылку раскидали по мессенджерам, и её открывают 300 человек в одну секунду — все одну и ту же. При этом в тот же момент другие читатели открывают свои цитаты, идёт обходчик архива, а каталог присылает новый снимок. Наивное решение: каждый из 300 идёт в каталог. Получаем 300 запросов к внешней системе и 300 задержек по 300 мс. Каталог ложится. ЧТО СДЕЛАЛ Один asyncio.Lock на каждую цитату. Первый запрос захватывает лок и идёт в каталог, остальные 299 ждут. Когда первый вернётся — данные уже в кэше, остальные получают готовую карточку мгновенно. На тесте: 1 промах / 299 попаданий. Только один поход в каталог вместо 300. Локи храню в WeakValueDictionary, чтобы не течь. Если цитат миллионы, а локи копятся навсегда — можно съесть всю память на одни блокировки. GC собирает их, когда на лок больше нет ссылок. ЕЩЁ ДВЕ ШТУКИ, КОТОРЫЕ ПРИШЛОСЬ ПРИДУМАТЬ 1. Снимок каталога — 110 МБ в одном запросе. Обычный json.loads() на 256 МБ RAM — гарантированный OOM. Читаю поток построчно, парсю одну запись за раз, обновляю каталог in-place. Пик памяти не превышает размер одной цитаты. 2. Каталог изначально хранил dict с полями. После перехода на raw JSON-байты RSS на 100 000 записей упал с 90 МБ до 48 МБ — почти в 2 раза. Иногда простые решения работают лучше умных. ИТОГ ПОД DOCKER С ЛИМИТАМИ ИЗ ЗАДАНИЯ — 100 000 записей импортируются за 0.6 секунды — 200 параллельных запросов к разным цитатам во время импорта — все 200 OK — 300 запросов к одной цитате → 1 промах / 299 попаданий — В простое: 30 МБ из 256 МБ, CPU 0.12% Что было самое интересное — это не код, а вот эти гоночные сценарии. Кажется, что "просто кэш", а на деле нужно думать про блокировки, память и поведение под нагрузкой. Код, документация и скриншоты тестов — на GitHub, ссылка в комментарии. #Python #FastAPI #Backend #SystemDesign

300 человек одновременно открыли одну цитату. Что делает сер | Сетка — социальная сеть от hh.ru 300 человек одновременно открыли одну цитату. Что делает сер | Сетка — социальная сеть от hh.ru