Messaging
Тема дорожной карты · Spring Boot
Spring Messaging — это фундаментальный модуль Spring Framework, предоставляющий единую абстракцию поверх коммуникации на основе сообщений, позволяя Spring Boot-приложениям бесшовно интегрироваться с такими брокерами, как RabbitMQ, Apache Kafka и ActiveMQ. Он определяет основные контракты — Message, MessageChannel и MessageHandler, — которые повторно используются в высокоуровневых проектах, включая Spring AMQP и Spring for Apache Kafka, что позволяет менять брокер с минимальными изменениями кода. Разработчики аннотируют методы-обработчики через @MessageMapping в WebSocket-потоках или используют @KafkaListener / @RabbitListener для очередных паттернов, тогда как MessagingTemplate предоставляет синхронную модель отправки-получения для сценариев запрос-ответ. Spring Messaging интегрируется с Spring Security для авторизации на уровне каналов и поддерживает реактивные варианты через Project Reactor, делая его ключевым строительным блоком как для традиционных, так и для реактивных Spring Boot-микросервисов, развёртываемых в Docker и Kubernetes.
Как это работает
Messaging: 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 под нагрузкой).
Типичные ошибки
Ловушки Messaging: auto-commit Kafka offsets до обработки (тихая потеря данных); @Async с дефолтным executor (unbounded thread pool); нет DLQ (poison messages блокируют consumers навсегда); @Scheduled на single-instance cron в multi-replica деплое (запускается N раз — Shedlock или k8s CronJob).