Sobes.tech
Senior

Vorbiți despre pattern-ul Transactional Outbox: ce este și cum funcționează?

sobes.tech AI

Răspuns de la AI

Паттерн Transactional Outbox используется для надёжной интеграции между микросервисами, когда нужно гарантировать, что событие будет опубликовано только если транзакция с данными прошла успешно.

Идея в том, что при изменении данных в базе в рамках одной транзакции одновременно записывается сообщение (outbox) в специальную таблицу. После коммита транзакции отдельный процесс читает эти сообщения из таблицы и отправляет их в очередь или брокер сообщений.

Это решает проблему "двухфазной коммита" между базой и системой сообщений, обеспечивая атомарность и согласованность.

Пример на Go (упрощённо):

// В рамках транзакции
tx, _ := db.Begin()
// Обновляем данные
_, err := tx.Exec("UPDATE orders SET status = ? WHERE id = ?", "processed", orderID)
// Записываем событие в outbox
_, err = tx.Exec("INSERT INTO outbox (event_type, payload) VALUES (?, ?)", "OrderProcessed", eventPayload)
// Коммит транзакции
err = tx.Commit()

// Отдельный воркер читает из outbox и публикует события