Ответ
В Apache Kafka Transaction Log — это внутренний механизм, обеспечивающий атомарность операций "произвести-потребить" (exactly-once semantics) между несколькими топиками и партициями.
Как это работает:
- Координатор транзакций: Специальный брокер (Transaction Coordinator) управляет жизненным циклом транзакции, назначая ей уникальный
transactional.id. - Запись контрольных сообщений: В каждую задействованную партицию записываются специальные маркерные сообщения (
COMMITилиABORT), которые отмечают границы транзакции. - Изоляция: Потребители с
isolation.level=read_committedвидят только зафиксированные сообщения.
Пример кода производителя с транзакцией:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("transactional.id", "my-transactional-id"); // Ключевой параметр
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.initTransactions(); // Инициализация
try {
producer.beginTransaction();
// Атомарная запись в несколько топиков
producer.send(new ProducerRecord<>("orders", "order1", "New Order"));
producer.send(new ProducerRecord<>("audit-log", "order1", "Order Created"));
producer.commitTransaction(); // Фиксация всех отправленных сообщений
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
producer.close(); // Неисправимые ошибки
} catch (KafkaException e) {
producer.abortTransaction(); // Откат всей транзакции
}
Преимущества: Гарантирует, что в рамках одной транзакции либо все сообщения будут записаны, либо ни одного, что критично для финансовых операций или синхронизации данных.