Инженерия за пределами
идеального сценария.
Заметки о системах на Python, которые выдерживают реальные нагрузки.
Решения, компромиссы и код, который за ними стоит.
Все статьи доступны ниже. Открыть архив →
С чего начать
Выберите интересную темуСтатьи
Заметки об инфраструктуреПочему замечания ИИ-ревью нужно проверять
Многие команды подключили к merge request ИИ-ревьюера. Он пишет замечания уверенно, как опытный коллега, но уверенный тон ещё не значит, что замечание верно.
Зачем выделять инфраструктуру Python-сервисов в библиотеки
Когда сервисов становится больше одного, у них появляется общая обвязка: пул соединений, ретраи, дедлайн запроса, порядок остановки.
Документация, с которой ИИ-агент пишет проверяемый код
Всё больше кода в сервисах пишут ИИ-агенты, и пишут его по той документации, которая есть у проекта. Чего в ней не хватает, агент додумывает сам, и не всегда верно.
Python-библиотека от шаблона до релиза
Небольшой общий код часто живёт копиями: в каждом сервисе своя функция, и со временем они расходятся.
Ядро без зависимостей: подключаем только нужные интеграции
Инфраструктурную библиотеку ставят во многие сервисы, и каждая её обязательная зависимость попадает в каждый из них, даже туда, где она не нужна.
Обслуживание партиций PostgreSQL: от плана до проверенного архива
Месячные партиции требуют ухода: каждый месяц кто-то должен создать таблицу на следующий месяц и убрать старую.
Как перевести таблицу PostgreSQL на партиционирование
Таблица событий растёт годами, и однажды запросы и удаление старых данных упираются в её размер. Тогда её решают разбить на месячные партиции.
Как проверять миграции Alembic в CI
Миграции схемы обычно проверяют в CI одним шагом: накатывают их на пустую базу. Если шаг зелёный, миграцию считают безопасной.
SQLAlchemy и PgBouncer: настройка и диагностика пула соединений
Когда сервисов и подов становится много, соединений с PostgreSQL перестаёт хватать, и перед базой ставят PgBouncer.
Сессии и транзакции в SQLAlchemy: кто отвечает за commit
Представьте сервис заказов интернет-магазина. Покупатель оформляет заказ, сервис сохраняет его и пишет событие created, по которому о заказе узнают склад и доставка.
Надёжная доставка событий: Outbox, Inbox и сбои Kafka
Представьте: покупатель оформляет заказ. Сервис заказов сохраняет его в PostgreSQL и публикует событие в Kafka. Биллинг читает это событие и выставляет счёт.
Kafka в Python: отправка, обработка и остановка сервиса
Сервис доставки публикует статусы посылок в Kafka, а сервис отслеживания читает их и показывает покупателю, где сейчас заказ.
Redis недоступен: какие запросы продолжают работать и почему PING об этом не скажет
В интернет-магазине Redis обычно стоит рядом с основной базой: кеширует цены, считает попытки входа и не пускает повторные нажатия «Оплатить». Пока он работает, о нём не думают.
Как подготовить gRPC-сервер на Python к продакшену
Поднять gRPC-сервер на Python несложно: хватает обработчика и пары строк запуска. Сложнее добиться, чтобы он вёл себя предсказуемо, когда что-то идёт не так.
Жизненный цикл Python-сервиса: запуск, проверки состояния и остановка
Сервис в Kubernetes перезапускают постоянно: при выкатке, масштабировании, переезде пода на другой узел.
Идемпотентность в API и фоновых задачах
Сеть теряет ответы, пользователи нажимают кнопку второй раз, брокеры доставляют сообщения повторно. Поэтому любой запрос и любое задание однажды придут дважды.
Как строить HTTP- и gRPC-клиенты для продакшена
Сервис заказов ходит на склад и в платёжный сервис, и любой из них иногда отвечает медленно или не отвечает вовсе. Первое, что хочется сделать, это повторить запрос.
Почему интерцепторы gRPC ломаются на потоковых RPC
Интерцепторы в gRPC обычно пишут один раз, чтобы логи, метрики и трассировка работали для всех вызовов сразу.
Почему таймаут не заменяет дедлайн в микросервисах
Запрос пользователя редко обслуживает один сервис. Обычно он проходит цепочку вызовов, у каждого вызова свой таймаут, и кажется, что этого хватит, чтобы запрос не висел вечно.
Статьи не найдены. Попробуем иначе?
Попробуйте более общий запрос, например «повторы» или «PostgreSQL», либо сбросьте фильтры.