Транзакции в 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: содержит информацию об изменении запасов после заказа
Шаги для транзакции:
- Создать продюсера с
transactional.id. - Отправить сообщения в транзакции: записать детали нового заказа в оба топика
ordersиinventory. - Если успешно, фиксируется (коммит) транзакция: сообщения видны для потребителей обоих топиков.
- Если ошибка, транзакция откатывается: ни одно сообщение не попадет в топики.
Результат: транзакция гарантирует, что потребители прочтут согласованные данные.