DEV Community

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

Posted on

2 2 2 2 2

🐰 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! 🎉

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay