backend

Крупный план микросхем памяти

Кеш — это не магия: разбираемся на пальцах

10.02.2026

«Просто добавьте кеш» — одна из самых частых рекомендаций, которую дают, когда сервис начинает тормозить. Проблема в том, что кеш — это не переключатель «быстро/медленно», а отдельная область со своими собственными способами всё сломать. Разберём по порядку.

Зачем вообще нужен кеш

Кеш имеет смысл, когда вычисление или получение данных дороже, чем их повторное использование. Классический пример — результат тяжёлого запроса к базе, который не меняется каждую секунду: список категорий товаров, агрегированная статистика за день, результат вызова внешнего API с лимитом запросов.

Крупный план серверного оборудования

PostgreSQL: пять привычек, которые сэкономили мне ночи

25.06.2025

За годы работы с PostgreSQL у меня накопился короткий список привычек, которые кажутся мелочью, пока не спасут вас от инцидента в два часа ночи. Делюсь пятью, которые считаю обязательными для любого проекта, где база — не игрушка.

1. Индекс на внешний ключ — не автоматический

В отличие от некоторых других СУБД, PostgreSQL не создаёт индекс на колонку внешнего ключа автоматически. Если у вас таблица orders с user_id, ссылающимся на users, и вы не добавили индекс вручную — удаление пользователя с большим числом заказов может заблокировать таблицу на неприятно долгое время. Я завёл себе правило: индекс на FK добавляется в той же миграции, что и сам внешний ключ, без исключений.

Экран терминала с логами

Логи, которые не врут: заметки о структурированном логировании

18.03.2025

Есть два типа логов: те, что пишутся для человека, который читает их глазами прямо сейчас, и те, что пишутся для системы, которая будет их искать, фильтровать и агрегировать. Долгое время я писал логи первого типа, и это работало ровно до тех пор, пока сервисов стало больше одного.

Как выглядела проблема

Классическая строка лога вида log.Printf("user %s created order %d", userID, orderID) прекрасно читается в консоли во время разработки. Но когда нужно найти все ошибки по конкретному пользователю за последний час среди миллионов строк в централизованном хранилище логов, текстовый поиск по подстроке — это очень медленный и ненадёжный способ.

Диаграмма архитектуры на доске

Почему я отказался от микросервисов в пет-проекте

20.02.2025

Полтора года назад я начал пет-проект — небольшой сервис для учёта личных расходов — и на радостях сразу нарисовал схему из семи микросервисов: авторизация, транзакции, категории, отчёты, уведомления, импорт банковских выписок и API-шлюз. Через месяц я всё это снёс и написал заново в виде одного монолитного приложения. Хочу объяснить, почему.

Соблазн красивой архитектуры

На работе я много имею дело с распределёнными системами, и мне казалось естественным переносить этот опыт на личный проект. Микросервисы выглядят солидно на диаграмме, каждый сервис — отдельная ответственность, всё по книжке. Проблема в том, что книжка писалась для команд из десятков человек и систем с реальной нагрузкой, а не для одного разработчика, который открывает ноутбук по вечерам два раза в неделю.

Серверная стойка в дата-центре

Как я перестал бояться очередей сообщений

14.11.2024

Три года назад я относился к очередям сообщений с суеверным страхом. Казалось, что стоит только добавить в систему брокер — и вместо одной проблемы получаешь три: недоставленные сообщения, дублирование и загадочные зависания консьюмеров по пятницам вечером. Сейчас я понимаю, что боялся не самих очередей, а того, что не читал документацию дальше раздела «быстрый старт».

С чего всё началось

Первый проект с очередью я унаследовал от коллеги, который уволился за неделю до релиза. RabbitMQ был настроен так, что при падении одного консьюмера сообщения копились в памяти брокера, пока диск не заканчивался. Это работало, пока нагрузка была маленькой, и превратилось в еженедельный ритуал перезапуска, когда нагрузка выросла.