Перейти к содержанию
БЛОГ BEDROCK

Инженерия за пределами
идеального сценария.

Заметки о системах на Python, которые выдерживают реальные нагрузки.
Решения, компромиссы и код, который за ними стоит.

Все статьи доступны ниже. Открыть архив →

С чего начать

Выберите интересную тему

Статьи

Заметки об инфраструктуре
HTTP и отказоустойчивость · Архитектура

Circuit breaker должен быть отдельным для каждого origin, а не клиента

Circuit breaker проще всего объяснить и проще всего привязать не к тому ключу. Объяснение помещается в предложение: после достаточного числа сбоев ненадолго прекратить вызовы…

PostgreSQL и SQLAlchemy · Руководства

PgBouncer в режиме транзакций и асинхронный SQLAlchemy: рабочая конфигурация, которой не хватает в документации

Конфигурация SQLAlchemy прекрасно работает напрямую с PostgreSQL. Затем перед БД ставят PgBouncer в режиме транзакций, ради которого обычно и нужен пулер, и прежние предположения…

HTTP и отказоустойчивость · Руководства

Retry-After, backoff и jitter: что делает HTTP-клиент в продакшене

Обычный цикл повторов — четыре строки: попытаться, поймать, подождать, повторить. Рабочая политика HTTP-клиента требует примерно восьми решений, которые этот цикл молча принимает…

Kafka и обмен сообщениями · Архитектура

Должно ли приложение создавать топики Kafka при запуске?

Кто-то должен создать топик. Кандидатов три: брокер автоматически при первом упоминании имени, приложение при запуске или человек через процесс управления кластером.

Kafka и обмен сообщениями · Архитектура

Доставка exactly-once — миф; однократные эффекты реальны

Kafka не может гарантировать ровно одно обновление вашей БД. Без общей транзакции этого не может гарантировать ни один брокер: база и брокер — две системы с двумя фиксациями, и…

Redis и идемпотентность · Архитектура

Идемпотентность в цепочке микросервисов

Один ключ идемпотентности в одном сервисе — решённая задача. В цепочке всё сложнее: важный повтор происходит наверху, важный эффект — внизу, а между ними два–три перехода с…

Redis и идемпотентность · Руководства

Идемпотентность фоновых задач и консьюмеров Kafka

Заголовок Idempotency-Key привлекает внимание, потому что у него есть имя и спецификация. Но та же проблема возникает у каждого worker очереди, причём чаще: очереди по своей…

PostgreSQL и SQLAlchemy · Руководства

Как партиционировать существующую таблицу PostgreSQL без переписывания приложения

ALTER TABLE ... PARTITION BY не существует. Чтобы сделать рабочую таблицу партиционированной, нужно создать нового родителя, присоединить старую таблицу как DEFAULT-партицию и…

Python и инструменты · Об экосистеме

Как я начинаю разработку Python-библиотеки для продакшена в 2026 году

Каждая библиотека этой серии начиналась одинаково: одна команда, сорок один файл и зелёные проверки примерно через три секунды. Речь о распределении усилий.

Redis и идемпотентность · Архитектура

Когда при сбое Redis стоит продолжать работу?

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

HTTP и отказоустойчивость · Архитектура

Повторы могут усугубить сбой: проектируем бюджет повторных попыток

Три попытки на каждом переходе цепочки из пяти сервисов — усилитель нагрузки, который сильнее всего действует именно при сбое нижнего сервиса, когда тот меньше всего способен…

Жизненный цикл сервиса · Архитектура

Почему жизненный цикл приложения не должен принадлежать FastAPI

lifespan FastAPI — хороший API: асинхронный контекстный менеджер с запуском до yield и остановкой после. Обычно туда помещают пул БД, прогрев, проверки здоровья и клиенты.

HTTP и отказоустойчивость · Архитектура

Почему я перестал писать обёртки над HTTP-клиентами

В каждой компании, где я работал, появлялась своя HTTP-обёртка: помощник повторов, класс конфигурации, метрики, затем class HttpClient в общем пакете, от которого зависят все и с…

PostgreSQL и SQLAlchemy · Руководства

Тестирование миграций с Testcontainers: вперёд, назад и снова вперёд

Статья о пяти тестах миграций объяснила, зачем они нужны. Здесь пошаговая настройка: от пустого tests/ до зелёной задачи CI, проходящей каждую ревизию вперёд, назад и снова…

Python и инструменты · Архитектура

Ядро без зависимостей: зачем инфраструктурным библиотекам необязательные зависимости

Инфраструктурная библиотека попадает во многие сервисы вместе со всеми своими зависимостями. Обычно об этом рассуждают отвлечённо.

HTTP и отказоустойчивость · Архитектура

Таймаут — не дедлайн: как теряется бюджет времени в микросервисах

Во всех сервисах, которые я запускал, на каждом исходящем вызове стоял таймаут. И каждый из этих сервисов всё равно умудрялся отвечать дольше любого числа в конфигурации.

PostgreSQL и SQLAlchemy · Библиотеки

Управление партициями PostgreSQL: от одного сбоя к другому

Партиционированная таблица может поднять вас с постели двумя способами. Первый — INSERT в 03:00, который PostgreSQL отклоняет, потому что никто не создал партицию на следующий…

Python и инструменты · Инструменты

Знакомьтесь: mr-review — проверка merge request с помощью ИИ

Ревью кода — одна из самых полезных практик в разработке, но её качество сильно колеблется. Ревьюеры устают, переключаются между задачами прямо во время проверки и что-то упускают.