
Идемпотентность в Python: цена ключей и цифры под нагрузкой
Дубли платежей и повторные списания рождаются не в коде обработчика, а в том, как вы храните ключи идемпотентности. Разбираем механику блокировок, замеры и места, где схема ломается.

Дубли платежей и повторные списания рождаются не в коде обработчика, а в том, как вы храните ключи идемпотентности. Разбираем механику блокировок, замеры и места, где схема ломается.

Профайлер показал, что 80% времени уходит в один цикл. Разбираем, когда его спасёт Cython, а когда сначала нужно переписать сам алгоритм и структуры данных.

Воркер на SIGTERM обрывал задачи посреди выполнения, а данные оставались в неконсистентном состоянии. Разбираем, почему стандартный signal.signal не спас и как устроена остановка процесса под управлением orchestrator.

Обработчик сигнала, который лезет в лог или дёргает asyncio-loop, — частая причина зависшего процесса при деплое. Разбираем, на что смотреть в ревью кода с signal.

Очередь задач копится быстрее, чем воркеры её разбирают, задержка растёт до минут, а память течёт. Разбираем, где Celery и RQ ломаются под нагрузкой и что мерить, пока не поздно.

Тесты корутин зелёные, но продакшн падает: забытый await молча возвращает объект корутины, event loop течёт между тестами, а mock не дожидается задач. Разбираем, где именно ломается pytest-asyncio и как это ловить.

Почему asyncio.sleep не блокирует поток, откуда берётся очередь готовых колбэков и что делает event loop между итерациями — разбор внутренностей планировщика в CPython 3.12.

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

Асинхронный генератор оставляет открытыми соединения, теряет aclose() при досрочном выходе и падает при финализации из чужого event loop. Разбираем, где именно ломается async for.

isinstance с Protocol работает в разы медленнее наследования от ABC, а без runtime_checkable падает с ошибкой. Разбираем, где протоколы бесплатны, а где бьют по горячему пути.

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

Сервис на Python 3.11 начал падать по OOM через несколько часов работы. Причина — самописный класс-коллекция, который выглядел как обычный список, но вёл себя иначе. Разбираем, где протекло и как это ловить.