
Дескрипторы и property в Python: как устроено внутри
property — не магия, а обёртка над протоколом дескрипторов. Разбираем, что вызывается при доступе к атрибуту, почему __set__ побеждает __dict__ и где кроется цена абстракции.

property — не магия, а обёртка над протоколом дескрипторов. Разбираем, что вызывается при доступе к атрибуту, почему __set__ побеждает __dict__ и где кроется цена абстракции.

После падения воркера RabbitMQ переотдаёт сообщение, и платёж списывается второй раз. Разбираем, почему exactly-once — миф на уровне доставки и как строить идемпотентность на стороне обработчика.

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

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

Два воркера забрали одну и ту же задачу, cron-джоба продублировалась на трёх нодах. Разбираем, как устроены брокер, идемпотентность и лидер-локи в распределённом планировщике на Python.

Как переписывать старый Python-код в проекте, который уже приносит деньги: тесты-сети, характеризующие тесты, feature-флаги и правило маленьких шагов вместо большого переписывания.

Воркеры простаивают, а задачи копятся в очереди. Разбираем, почему наивный планировщик на Celery деградирует под нагрузкой и что даёт справедливое распределение, батчинг и prefetch=1 на цифрах до и после.

Один cron-джоб на трёх воркерах отправил клиентам письмо трижды. Разбираем, почему APScheduler и наивный планировщик дублируют задачи в распределённой среде и как это лечить блокировкой в БД.

Обмен объектами между процессами в multiprocessing проходит через pickle — и на больших массивах это стоит секунд и гигабайтов. Разбираем, где именно теряется время и чем pickle можно обойти.

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

Пул из восьми процессов на 32-ядерной машине упирается не в CPU, а в сериализацию и копирование при fork. Разбираем, почему shared_memory течёт, где multiprocessing.Manager становится узким горлышком и что мерить.

Воркер Celery за сутки разросся с 200 МБ до 3 ГБ, OOM-killer убил процесс на пике нагрузки. Разбираем, как найти, что течёт, чем мерить и где Python обманывает ожидания.