DEV Community

Cover image for 🐰 Kafka и Spring: Почтовый голубь против почтовой службы 🌸
Olga Lugacheva
Olga Lugacheva

Posted on

🐰 Kafka и Spring: Почтовый голубь против почтовой службы 🌸

Представьте весенний лес. Солнышко светит, цветочки распускаются, птички щебечут, а зайчики 🐰 дружно решили поздравить друг друга с весной!

Но тут встаёт вопрос: как быстро доставить открытки всем друзьям?

У зайчика Санни есть два варианта:

Почтовый голубь 🕊️ – берёт письмо и летит к получателю. Правда, иногда задерживается, может устать или вообще перепутать адрес.
Супер-зайцевая почтовая служба Kafka 🚀 – распределяет все открытки в мгновение ока, без ожиданий и задержек.
Вот так же в программировании различается синхронность (когда ждём, пока голубь долетит) и асинхронность (когда всё отправляется моментально через Kafka).

Давайте поможем зайчикам разослать поздравления! 🐇✨

🕊️ Почтовый голубь: как работает синхронность

bird
Сначала наш зайчик Санни попробовал отправлять поздравления через обычный REST-контроллер.

@RestController
@RequestMapping("/greetings")
public class GreetingController {

    @GetMapping("/{name}")
    public String sendGreeting(@PathVariable String name) {
        return "🌸 Привет, " + name + "! С первым днём весны! 🐰";
    }
}

Enter fullscreen mode Exit fullscreen mode

Каждый зайчик отправляет открытку и ждёт ответа. Пока письмо не доставлено – следующий не отправить.

📬 Kafka: быстрая зайцевая почта

kafka
Санни решил создать настоящую почтовую службу для зайчиков с Kafka! Теперь сообщения отправляются в специальный "почтовый центр", где их обрабатывают супер-зайцы-почтальоны.

🛠️ Настройка Kafka в Spring Boot
Добавляем зависимости в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

Enter fullscreen mode Exit fullscreen mode

Настраиваем application.yml:

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: bunny-post-group
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
Enter fullscreen mode Exit fullscreen mode

Теперь наш почтовый центр готов работать! 🏡📮

🐇📩 Отправляем поздравления зайцам
Санни создал производителя (producer), который отправляет открытки в лесную почту.

@Component
public class GreetingProducer {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public GreetingProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendGreeting(String name) {
        String message = "Привет, " + name + "! Весеннего тебе настроения! 🌸";
        kafkaTemplate.send("bunny-greetings", message);
    }
}

Enter fullscreen mode Exit fullscreen mode
@RestController
@RequestMapping("/greetings")
public class GreetingController {

    private final GreetingProducer producer;

    public GreetingController(GreetingProducer producer) {
        this.producer = producer;
    }

    @PostMapping("/{name}")
    public String sendGreeting(@PathVariable String name) {
        producer.sendGreeting(name);
        return "Твоя открытка   для  🌸"+ name + "🌸 отправлена 🐰";
    }
}
Enter fullscreen mode Exit fullscreen mode

logbef0

Зайчики теперь могут отправлять поздравления без ожиданий!

🐰📬 Почтальоны-консьюмеры: доставляем открытки

Теперь создадим консьюмера (consumer) – зайцев, которые разносят открытки по лесу.

@Component
public class GreetingConsumer {

    @KafkaListener(topics = "bunny-greetings", groupId = "bunny-post-group")
    public void receiveGreeting(String message) {
        System.out.println("📩 Зайчик получил сообщение: " + message);
    }
}

Enter fullscreen mode Exit fullscreen mode

Еще немного технических деталей:

Kafka должна быть запущена
Если у тебя её ещё нет, можно поднять Kafka локально через Docker:

docker-compose up -d

Enter fullscreen mode Exit fullscreen mode

Один из вариантов docker-compose.yml для Kafka и Zookeeper:

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper:latest
    container_name: zookeeper
    ports:
      - "2181:2181"

  kafka:
    image: wurstmeister/kafka:latest
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    depends_on:
      - zookeeper
Enter fullscreen mode Exit fullscreen mode

Теперь каждый зайчик асинхронно получает своё поздравление, даже если отправителей много.

🌸Финальный результат

Теперь лесная почта работает так:

log0

🐇 Зайчик отправляет поздравление → Оно уходит в Kafka.
🚀 Kafka мгновенно раздаёт открытки всем зайцам-почтальонам.
📩 Каждый зайчик получает сообщение, не дожидаясь других.
Всё работает параллельно и без задержек. Теперь никакие зайцы не останутся без поздравлений!

Итог

Почтовый голубь Rest (синхронность) – всё работает, но медленно.
Kafka (асинхронность) – сообщения передаются мгновенно, без ожидания!
Spring Boot + Kafka позволяют легко отправлять и получать сообщения.
Зайчики довольны, весна пришла, а поздравления разосланы! 🌷🐰

Поздравляйте друзей правильно – асинхронно с Kafka! 🎉

Top comments (0)

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️