Spring Kafka

Тема дорожной карты · Spring Boot

Spring Kafka — это интеграционная библиотека Spring Framework для Apache Kafka, предоставляющая KafkaTemplate для отправки сообщений и аннотационно-управляемую модель программирования с @KafkaListener для их потребления в Spring Boot-приложениях. Добавление spring-kafka в classpath вместе со spring-boot-starter включает авто-конфигурацию Spring Boot для KafkaTemplate, ConsumerFactory и ProducerFactory с использованием свойств с префиксами spring.kafka.bootstrap-servers, spring.kafka.consumer.group-id и spring.kafka.producer.key-serializer. Аннотация @KafkaListener(topics = "orders", groupId = "inventory-service") на методе @Service обозначает его как Kafka-консьюмер, выполняющийся на ConcurrentMessageListenerContainer с поддержкой конкурентности, обработки ошибок и ручного подтверждения через Acknowledgment.acknowledge(). Spring Kafka поддерживает транзакционную отправку сообщений через KafkaTransactionManager, интегрированный с аннотацией Spring @Transactional, обеспечивая семантику exactly-once при одновременной записи в Kafka и обновлении базы данных в одной транзакции. Для тестирования Kafka-консьюмеров и продюсеров @EmbeddedKafka поднимает внутрипроцессный Kafka-брокер, а хелперы KafkaTestUtils Spring Boot упрощают отправку тестовых сообщений и проверку потреблённых записей.

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

Spring Kafka: Spring Kafka (@KafkaListener + KafkaTemplate) для high-throughput event streaming. Spring AMQP (@RabbitListener + RabbitTemplate) для RabbitMQ. @Scheduled cron-style scheduling; @Async для fire-and-forget задач (с явным executor — никогда дефолт). ApplicationEvent + @EventListener для in-process pub/sub. Выбирайте Kafka для streams + replay; RabbitMQ для routing-heavy work queues; in-process events для decoupling внутри одного app.

Когда применять

Consumer groups + offsets конфигурируйте тщательно (auto-commit прячет баги). Всегда handle poison messages (DLQ или dead-letter topic). Idempotent consumers — at-least-once delivery норма. Для @Async сконфигурируйте bounded executor (дефолт unbounded — OOM под нагрузкой).

Типичные ошибки

Ловушки Spring Kafka: auto-commit Kafka offsets до обработки (тихая потеря данных); @Async с дефолтным executor (unbounded thread pool); нет DLQ (poison messages блокируют consumers навсегда); @Scheduled на single-instance cron в multi-replica деплое (запускается N раз — Shedlock или k8s CronJob).

Связанные понятия

Полезные ресурсы