Перейти к основному содержимому

Транзакции в Apache Kafka

Kafka поддерживает транзакции, чтобы гарантировать выполнение операций по принципу «всё или ничего».
Такая гарантия доставки называется exactly-once.

Подробнее о других типах гарантии доставки тут.

Когда применяется

  • если требуется согласованность между несколькими топиками
  • в операциях, где частичное изменение данных недопустимо (в финансовых приложениях, логистике, управлении запасами и заказами)

Как работают транзакции в Kafka

  • Продюсер начинает транзакцию, присваивает уникальный transactional.id. Это идентификатор, который отличает записи транзакций.
  • Продюсер отправляет сообщения в одну / несколько очередей с пометкой "транзакционные".
  • Продюсер подтверждает данные (коммит) или отменяет (откат).
    • Коммит фиксирует сообщения, и они становятся видимы потребителям, в противном случае — откатываются.

ACID в Kafka

  • Атомарность (Atomicity): вся группа сообщений фиксируется сразу.
  • Согласованность (Consistency): контроль за статусами сообщений в метаданных.
  • Изолированность (Isolation): с помощью настройки read_committed (на стороне консьюмера) потребители могут видеть только зафиксированные данные, пока транзакция не завершена.
  • Долговечность (Durability): достигается за счет репликации и журналов с зафиксированными сообщениями.

Плюсы и минусы

Плюсы:

  • гарантия целостности операций с использованием ACID
  • защита от дублирования и конфликтов через изоляцию транзакций

Минусы:

  • требуют больше ресурсов, что может снизить производительность
  • поддерживаются с версии Kafka 0.11.0

Пример транзакции в Kafka

Система обработки заказов. Нужно записать информацию сразу в несколько топиков для согласованности данных.

Есть два топика в Kafka:

  • orders: хранит общую информацию о заказе
  • inventory: содержит информацию об изменении запасов после заказа

Шаги для транзакции:

  1. Создать продюсера с transactional.id.
  2. Отправить сообщения в транзакции: записать детали нового заказа в оба топика orders и inventory.
  3. Если успешно, фиксируется (коммит) транзакция: сообщения видны для потребителей обоих топиков.
  4. Если ошибка, транзакция откатывается: ни одно сообщение не попадет в топики.

Результат: транзакция гарантирует, что потребители прочтут согласованные данные.

Настройки транзакций в Kafka

  • Для включения транзакций продюсеру нужно задать transactional.id.
  • Стоит настроить transaction.timeout.ms — максимальное время, которое транзакция активна.
  • Для обработки только зафиксированных транзакций нужно включить isolation.level=read_committed. Это позволит избежать чтения незавершенных транзакций.

Типичные ошибки

  • Ошибка producer fenced: если несколько продюсеров используют один и тот же transactional.id.
    Может произойти в случае сбоя, если один продюсер не завершил транзакцию, а новый использует этот transactional.id.
    ✅ Каждый продюсер должен иметь уникальный transactional.id.

  • Длительные транзакции увеличивают вероятность сбоев.
    ✅ Ограничить объём сообщений в одной транзакции и задать оптимальные таймауты.

  • Если транзакция превышает тайм-аут transaction.timeout.ms, Kafka автоматически откатит её.
    ✅ Выбирать тайм-ауты по объёму работы, чтобы не терять данные из-за автоматических откатов.

Подборка материалов

  1. Изоляция транзакций в Apache Kafka при потреблении сообщений
  2. Семантика exactly-once в Apache Kafka
  3. Транзакции в Apache Kafka: атомарность публикации сообщений
  4. Что такое гарантия доставки сообщений или как избавиться от дублей и потерь в Apache Kafka и других Big Data брокерах
  5. Когда НЕ нужно использовать Apache Kafka?
  6. Транзакционные сообщения очередей сообщений, как это делают RocketMQ и Kafka?

Посты из нашего канала

  1. Apache Kafka
  2. Основы Kafka – что нужно знать аналитику
  3. Очереди сообщений. Основные понятия
  4. Как выбрать тип межсистемной интеграции
  5. Что нужно знать про асинхронные интеграции
  6. Подборка материалов про асинхронную интеграцию и очереди сообщений
  7. Kafka vs RabbitMQ: сравнение по пунктам
  8. Требования ACID: Краткий обзор
  9. Изолированность транзакций в БД: MVCC, блокировки

Видео

  1. Рассказ про exactly once в kafka
  2. Apache Kafka® Transactions: Message Delivery and Exactly-Once Semantics
  3. Ровно однажды обработка в Кафке

Книги

  1. Kafka в действии — Дилан Скотт, Виктор Гамов и Дейв Клейн
  2. Apache Kafka. Потоковая обработка и анализ данных — Гвен Шапира, Тодд Палино, Раджини Сиварам, Крит Петти
  3. Effective Kafka: A Hands-On Guide to Building Robust and Scalable Event-Driven Applications with Code Examples in Java — Emil Koutanov (англ)
    Обзор 2 и 3 книги
  4. Проектирование событийно-ориентированных систем.Концепции и шаблоны проектирования сервисов потоковой обработки данных с использованием Apache Kafka - Бен Стопфорд