Проверяет понимание паттерна Outbox для обеспечения надежной доставки сообщений в распределенных системах.
Outbox Pattern (паттерн исходящей почты) решает проблему надежной доставки сообщений в распределенных системах, особенно при использовании микросервисной архитектуры. Основная идея заключается в том, чтобы гарантировать, что сообщение будет отправлено ровно один раз, даже в случае сбоев.
Вместо того чтобы напрямую отправлять сообщение в брокер (например, RabbitMQ или Kafka) после изменения данных в базе, мы сохраняем сообщение в специальную таблицу outbox в той же транзакции базы данных. Это гарантирует, что либо и данные, и сообщение сохранятся, либо ничего не сохранится (атомарность). Затем отдельный фоновый процесс (publisher) читает записи из таблицы outbox и отправляет их в брокер. После успешной отправки запись помечается как обработанная или удаляется.
def create_order(order_data):
with db.transaction():
# 1. Сохраняем заказ
db.execute("INSERT INTO orders ...", order_data)
# 2. Сохраняем событие в outbox
db.execute("INSERT INTO outbox (event_type, payload) VALUES ('order_created', ?)", order_data)
# Транзакция завершена - данные и событие сохранены атомарно
# Фоновый процесс
while True:
events = db.execute("SELECT * FROM outbox WHERE processed = FALSE LIMIT 10")
for event in events:
try:
send_to_broker(event)
db.execute("UPDATE outbox SET processed = TRUE WHERE id = ?", event.id)
except Exception as e:
log_error(e)
# Повторим попытку позжеOutbox Pattern — это надежный способ гарантировать доставку сообщений в распределенных системах, особенно когда важна согласованность данных. Его стоит применять в микросервисах, где требуется атомарность между изменением состояния и отправкой события, и где потеря сообщения недопустима.