Sobes.tech
Back to questions
Senior
6

Как был реализован Outbox Pattern? Какой инструмент отправлял из таблицы outbox в Kafka?

Companies where asked
Lenta Tech

Answer from AI

sobes.tech AI

Outbox Pattern — это способ гарантировать атомарность записи бизнес-данных и сообщений для интеграции с другими системами. В базе создаётся таблица outbox, куда в рамках одной транзакции записываются события, которые нужно отправить в Kafka.

Реализация обычно включает:

  • Запись события в таблицу outbox вместе с основной бизнес-операцией в одной транзакции.
  • Отдельный процесс или сервис, который периодически читает новые записи из outbox, отправляет их в Kafka и помечает как отправленные.

В Go часто используют специализированные библиотеки или пишут свой сервис с использованием Kafka Producer API. Для чтения и отправки сообщений из таблицы outbox можно использовать:

  • Cron-задачу или daemon, который опрашивает таблицу.
  • Инструменты CDC (Change Data Capture), например Debezium, которые отслеживают изменения в базе и публикуют их в Kafka.

Пример упрощённого кода отправки из outbox в Kafka на Go:

rows, _ := db.Query("SELECT id, payload FROM outbox WHERE sent = false")
for rows.Next() {
    var id int
    var payload string
    rows.Scan(&id, &payload)
    // Отправка в Kafka
    producer.Produce(&kafka.Message{TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Value: []byte(payload)}, nil)
    // Обновление статуса
    db.Exec("UPDATE outbox SET sent = true WHERE id = $1", id)
}