Что такое Transaction Log в Apache Kafka и как он используется?

«Что такое Transaction Log в Apache Kafka и как он используется?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Apache Kafka Transaction Log — это внутренний механизм, обеспечивающий атомарность операций "произвести-потребить" (exactly-once semantics) между несколькими топиками и партициями.

Как это работает:

  1. Координатор транзакций: Специальный брокер (Transaction Coordinator) управляет жизненным циклом транзакции, назначая ей уникальный transactional.id.
  2. Запись контрольных сообщений: В каждую задействованную партицию записываются специальные маркерные сообщения (COMMIT или ABORT), которые отмечают границы транзакции.
  3. Изоляция: Потребители с 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(); // Откат всей транзакции
}

Преимущества: Гарантирует, что в рамках одной транзакции либо все сообщения будут записаны, либо ни одного, что критично для финансовых операций или синхронизации данных.