TGViewer
У нас на созвоне У нас на созвоне @simplcalls · 195 subscribers
Post #516 273
Как мы уронили сервис и подняли его с помощью кэша

В одном из наших внутренних сервисов случилась беда: при расчёте проектов он начал падать с ошибкой памяти. Начали разбираться — оказалось, за один расчёт сервис макропараметров дёргался до 3000 раз. И каждый раз он честно ходил в базу, что‑то там искал, отдавал и в какой‑то момент просто не выдерживал.

Нужно было что‑то делать. И желательно без долгих переписываний.

✅Первая мысль — кэш
Обычно в таких случаях ставят MemoryCache: сохранили данные — при повторном запросе отдали из памяти. Но есть нюанс: логика кэширования ложится на разработчика. Нужно писать код, проверять, сохранять, думать, когда инвалидировать.

И тут мы наткнулись на OutputCache. Штука, которая появилась в .NET 8, и она работает хитрее: кэширует не просто данные, а целиком HTTP-ответ.

Как это выглядит⬇️
Прилетает запрос — OutputCache смотрит: а нет ли у меня уже готового ответа на точно такой же запрос? Если есть — сразу отдаёт, даже не дёргая контроллер и не выполняя бизнес-логику. Если нет — пропускает запрос дальше, а ответ сохраняет.

Звучит просто, но разница колоссальная:
— код не меняется вообще (ну почти),
— путь запроса становится короче,
— сервер меньше грузится.

Но есть подводный камень❤️‍🩹
OutputCache кэширует ответ целиком. Вместе с заголовками. А значит, если не настроить политики, можно случайно «склеить» разных пользователей и отдать одному — куки другого. Пришлось аккуратно прописать, что именно учитывать при формировании ключа кэша: параметры маршрута, query-параметры, а для POST-запросов — ещё и тело.

Что получили
〰️До внедрения: тяжёлый метод GetMacroVersionData за 7 минут разогревался до 12 секунд ответа.
〰️После: стабильные 32 миллисекунды на протяжении 15 минут.

И да, сервис перестал падать.

📎 Кстати, про управление кэшем
Чтобы сбрасывать устаревшие данные, мы повесили теги. В OutputCache есть такой механизм управления кэшем. Можно сбросить всё разом, можно только то, что связано с макропараметрами, можно — конкретные данные внутри. Удобно и гибко.
  • 👍 5
  • ❤ 3
More from @simplcalls
  1. Sep 24, 2026🚀 Большая разведка — большие идеи На днях руководитель наших аналитиков Валентина Юдина п…
  2. Sep 17, 2026Сентябрь — время сочинений на тему «Как я провёл лето» ☀️ Мы тоже решили не пропускать эту…
  3. Sep 14, 2026День программиста — всё! 👻 Вместе со «Школой 21» собрали ИТ-сообщество Перми и поговорили…
  4. Sep 12, 2026Post #671
  5. Sep 12, 2026Post #670
  6. Sep 12, 2026Начали митап «Снова в школу» 💼
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →