Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Транзакции Kafka

Транзакция Kafka делает записи в нескольких партициях и прочитанные смещения видимыми вместе или не делает видимым ничего.

Транзакция «прочитать, преобразовать, записать»: записи и прочитанные смещения фиксируются вместе, а прерывание отбрасывает и то и другоеНачалона транзакционном продюсереЗаписьв любые партицииОтправка прочитанных смещенийс метаданными группыФиксациятранзакцииЧитатель read_committedвидит записи, а смещениясчитаются зафиксированнымиПрерывание:записи отброшены,смещения на месте,вход читаетсязановоОдин транзакционный id принадлежит одному живому продюсеру:повторная инициализация отсекает прежний
Схема текстом
  1. Начало на транзакционном продюсере → Запись в любые партиции
  2. Запись в любые партиции → Отправка прочитанных смещений с метаданными группы
  3. Отправка прочитанных смещений с метаданными группы → Фиксация транзакции
  4. Фиксация транзакции → Читатель read_committed видит записи, а смещения считаются зафиксированными: маркеры записаны
  5. Отправка прочитанных смещений с метаданными группы → Прерывание: записи отброшены, смещения на месте, вход читается заново: при ошибке
  6. Один транзакционный id принадлежит одному живому продюсеру: повторная инициализация отсекает прежний

Транзакционного продюсера называет его transactional.id. Он ведёт по одной транзакции за раз. Записи, отправленные внутри неё, попадают в журнал сразу, а фиксация пишет маркеры, которые делают их видимыми.

Читатель с уровнем изоляции read_committed, который в librdkafka стоит по умолчанию, видит записи транзакции только после фиксации и никогда после прерывания. Читатель с уровнем read_uncommitted видит их по мере записи.

Прочитанные смещения могут войти в транзакцию. Тогда входные позиции сдвигаются ровно в тот момент, когда результат становится видимым. Это схема «прочитать, преобразовать, записать» из KIP-447. Прерывание оставляет смещения на месте, поэтому вход читается заново, уже в новую транзакцию.

Транзакцию, открытую дольше transaction.timeout.ms (одна минута), прерывает координатор. Продюсер, запущенный с уже занятым id, отсекает прежний: следующий вызов того продюсера завершается ошибкой.

Значения по умолчанию и правило отсечения взяты из librdkafka (транзакционный продюсер, конфигурация).