Доставка: события публикации через RabbitMQ
Создадим «Доставку» — самостоятельный комплект обмена фактами публикации материала между владельцем API, каталогом и аудитом. Объявим topology, опубликуем событие, разделим направления подтверждений, добавим ограниченные повторы и разбор отказов. Завершим inbox-квитанцией, защитой редакций и transactional outbox.
Серия посвящена broker-обмену между сервисами. Redis и фоновые задачи и Temporal Workflow рассматривают другие модели работы. Запуск OpenSearch не требуется: наш event payload не является поисковой записью, для соединения проектов нужен отдельный адаптер. Предполагается знакомство с Python, HTTP, JSON и локальной транзакцией.
Python 3.13, RabbitMQ 4.3.6, Pika 1.3.2; SQLite входит в Python-runtime. Читатель предоставляет отдельный broker и устанавливает указанную зависимость в своей среде.
Одноузловые durable classic queues, локальные SQLite-эффекты, один relay, API только на loopback без входа. Ordinary TTL/DLX retry имеет отдельный предел сохранности. Серия не обещает exactly-once, универсальную at-least-once-доставку при всех отказах или автоматическую совместимость с OpenSearch.
Архив полного итогового проекта содержит реальные исходники, README, данные и карту этапов. Это один проект, не набор самостоятельных снимков уроков. Учебные приложения, broker/engine, базы, запросы, тесты и замеры при подготовке не запускались. Все результаты статей обозначены ожидаемыми.
Уроки и результаты
| № | Урок | Новый результат |
|---|---|---|
| 01 | Событие публикации и границы доставки | Команда и v1-факт различаются |
| 02 | Соединение, канал и долговечная топология | Connection/channel и durable-объекты заданы |
| 03 | Издатель сообщения и свойства конверта | Событие публикуется с message_id |
| 04 | Exchanges и независимые маршруты получателей | Независимые получатели и resume различены |
| 05 | Подтверждение после фиксации эффекта | Ack следует после локального commit |
| 06 | Publisher confirms и неизвестный исход публикации | Confirm/return и неизвестный исход различаются |
| 07 | Отложенный повтор для одного обработчика | Retry имеет TTL, предел и адресный возврат |
| 08 | Очередь отказов и осознанный повтор | Несовместимое и исчерпанное сообщение сохраняется |
| 09 | Идемпотентный эффект и квитанция inbox | Inbox и эффект фиксируются вместе |
| 10 | Восстановление соединения и порядок редакций | Клиент восстанавливает connection/channel с паузой |
| 11 | API публикации и transactional outbox | API сохраняет material/request/outbox, relay получает confirm |
| 12 | Наблюдение и передача проекта Доставка | Pending/ready/unacked/retry/dead и границы описаны |
Восемь серий объединяет маршрут интерактивного веба.