Apache Kafka

Проработать:

  1. Exactly Once Delivery Semantics в Apache Kafka
  2. Apache Kafka vs message queue explained
  3. Григорий Кошелев — Kafka: от теории к практике
  4. Немного о: RabbitMQ, Kafka, Redis, Memcached, NuxtJS, MongoDB, PostgreSQL
  5. Apache Kafka: устройство, плюсы, минусы и границы применимости
  6. System Design: Why is Kafka fast?
  7. Общение микросервисов между собой | Java | Kafka на практике
  8. Про Kafka (основы)
  9. Apache Kafka – мой конспект
  10. Apache Kafka + Spring Boot: Hello, microservices
  11. Kafka без боли: моя шпаргалка для собесов в Java. Часть 5
  12. Секреты Apache Kafka API: обработка сообщений без потерь и дублей
  13. Apache Kafka: ZooKeeper vs KRaft — полное сравнение подходов
  14. Kafka Streams для начинающих. Потоковая обработка данных в мире Java
  15. Потоковая обработка данных с помощью Kafka Streams: архитектура и ключевые концепции
  16. Consumer Lag

Основные разделы

Что это

Apache Kafka - это высокопроизводительная система обмена сообщениями для публикации-подписки, реализованная как распределенная, разделенная, реплицированная служба журнала фиксации. ZooKeeper - для работы с Kafka необходим координатор. Поэтому вначале стартуем ZooKeeper, затем сервер Kafka.

Для чего

Преимущества

Setting

Common kafka entities

Partition и Consumer

Если 5 Partitions и 10 Consumers

Один Partition может обслуживать только одного Consumer. Если больше Consumers они будут простаивать.

Если 10 Partitions и 5 Consumers

Каждый Consumer обрабатывает 2 Partitions

Подключение

При первом запросе на kafka broker, всегда будет возвращаться список ip и ports всех kafka brokers в Kafka cluster. Со второго вопроса начнется работа обмена данными.

Программы для мониторинга

  1. Kafka Tool
  2. KafkaCat

Ключ

Если 2 сообщения с одним ключем - будет добавлено 2 записи в один partition.

Kafka использует hash(key) % number_of_partitions для определения Partition.

Kafka транзакции в Spring Boot

Что гарантируют Kafka транзакции:

Что НЕ гарантируют:

Конфигурация продюсера

propertiesspring.kafka.producer.properties.enable.idempotence=true
spring.kafka.producer.properties.transactional.id=order-service-${random.value}-
        

Конфигурация консьюмера

propertiesspring.kafka.consumer.isolation-level=read_committed

Добавляем TransactionManager

.
@Bean
public KafkaTransactionManager<String, Object> kafkaTransactionManager(
        ProducerFactory<String, Object> producerFactory
) {
    return new KafkaTransactionManager<>(producerFactory);
}
        

Используем @Transactional

@Transactional
public void publishOrderResult(OrderRequest request) {
    String orderId = UUID.randomUUID().toString();
    OrderPlacedEvent event = new OrderPlacedEvent(
        orderId,
        request.email(),
        request.productName()
    );

    kafkaTemplate.send("order-placed", orderId, event);
    kafkaTemplate.send("order-audit", orderId, event);
    // Обе отправки атомарны — либо обе успешны, либо обе откатятся
}
        

Важно: если в приложении есть и Kafka и JPA TransactionManager:

Вариант 1 — пометить как @Primary:

@Primary
@Bean
public KafkaTransactionManager<String, Object> kafkaTransactionManager(...) {...}
        
Вариант 2 — явно указать:

@Transactional("kafkaTransactionManager")
public void publishOrderResult(...) {...}
        

В большинстве систем дедупликация и идемпотентность — более простое и эффективное решение.