Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Транзакции Kafka
Транзакция Kafka делает записи в нескольких партициях и прочитанные смещения видимыми вместе или не делает видимым ничего.
Схема текстом
- Начало на транзакционном продюсере → Запись в любые партиции
- Запись в любые партиции → Отправка прочитанных смещений с метаданными группы
- Отправка прочитанных смещений с метаданными группы → Фиксация транзакции
- Фиксация транзакции → Читатель read_committed видит записи, а смещения считаются зафиксированными: маркеры записаны
- Отправка прочитанных смещений с метаданными группы → Прерывание: записи отброшены, смещения на месте, вход читается заново: при ошибке
- Один транзакционный id принадлежит одному живому продюсеру: повторная инициализация отсекает прежний
Транзакционного продюсера называет его transactional.id. Он ведёт по одной транзакции за раз.
Записи, отправленные внутри неё, попадают в журнал сразу, а фиксация пишет маркеры, которые делают
их видимыми.
Читатель с уровнем изоляции read_committed, который в librdkafka стоит по умолчанию, видит
записи транзакции только после фиксации и никогда после прерывания. Читатель с уровнем
read_uncommitted видит их по мере записи.
Прочитанные смещения могут войти в транзакцию. Тогда входные позиции сдвигаются ровно в тот момент, когда результат становится видимым. Это схема «прочитать, преобразовать, записать» из KIP-447. Прерывание оставляет смещения на месте, поэтому вход читается заново, уже в новую транзакцию.
Транзакцию, открытую дольше transaction.timeout.ms (одна минута), прерывает координатор.
Продюсер, запущенный с уже занятым id, отсекает прежний: следующий вызов того продюсера
завершается ошибкой.
Значения по умолчанию и правило отсечения взяты из librdkafka (транзакционный продюсер, конфигурация).