Задать вопрос
@utsiye

Что использовать для outbox паттерн?

Есть монолитное приложение на FastAPI. Необходимо обеспечить event consistency при операциях создания/удаления. Например, при удалении сообщения нужно атомарно:

1. Удалить запись из БД
2. Удалить файл из S3
3. Разослать уведомление по WebSocket (in-memory хранятся)

- Монолит, микросервисов нет
- Message broker (RabbitMQ и т.п.) кажется избыточным

Думал над вариантом с Outbox-таблицей + функция в том же процессе, что и fastapi, которая поллит таблицу и обрабатывает события без брокера, а напрямую обращается к s3/websocket.

Вопрос: Насколько жизнеспособен подход Outbox-таблица + polling в данном контексте? Какие подводные камни у этого решения и есть ли более подходящие альтернативы для монолита с подобными требованиями?
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Простой 6 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия 1С-программист
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
TrueBers
@TrueBers
Гуглю за еду
при удалении сообщения нужно атомарно:

1. Удалить запись из БД
2. Удалить файл из S3
3. Разослать уведомление по WebSocket (in-memory хранятся)

А зачем вообще все три составляющие пихать в транзакцию?
Тут атомарность и транзакционность только для БД нужна, для остального нужна идемпотентность и асинхронность. Удаление из S3 это просто "подчистка кеша/артефактов" по сути, а WebSocket — как ненадёжный best-effort event notify hint. Последние два могут вообще прийти заметно позже, чем факт транзакции в БД, кто от этого пострадает то? Просто держишь БД за источник консистентной истины, а остальное доводишь уже в отдельном воркере асинхронно как логический коммит.

Например, можно при транзакции БД помечать записать как soft-deleted, а уже когда отрабатывает полный коммит подчистки всех артефактов, можно сделать hard delete, если память не бесконечная.

Поллинг — ну такое, лучше будет pub/sub. Поллинг можно оставить как fallback.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы