Skip to content

FirstOnDie/OrderNotification

Repository files navigation

📡 Notificaciones de Pedidos en Tiempo Real con Kafka y Spring Boot

📌 Descripción

Este proyecto es un sistema de notificaciones de pedidos en tiempo real usando Apache Kafka con Spring Boot.

📌 ¿Qué hace esta aplicación?

  • Un Productor envía pedidos a Kafka.
  • Kafka almacena los mensajes en un topic.
  • Un Consumidor lee los pedidos desde Kafka y los procesa en tiempo real.

Caso de uso:
👉 Imagina una tienda online donde cada vez que un usuario compra un producto, el sistema envía una notificación a un servicio de logística.
👉 Kafka nos permite procesar esas notificaciones de manera eficiente y escalable.


🔍 ¿Qué es Apache Kafka?

📌 Kafka en una frase:

🚀 Kafka es un sistema de mensajería distribuido que permite procesar datos en tiempo real.

📌 Explicación sencilla

Kafka funciona como un "📬 buzón de mensajes".

  • Un productor 📝 coloca un mensaje en el buzón (Kafka).
  • Un consumidor 📩 recoge el mensaje y lo procesa.
  • Kafka garantiza que los mensajes lleguen y se puedan leer en orden.

📌 Kafka es ideal para:
✅ Sistemas de monitoreo en tiempo real.
✅ Comunicación entre microservicios.
✅ Procesamiento de grandes volúmenes de datos.


🔍 ¿Qué es Zookeeper?

📌 Zookeeper es el "gerente" de Kafka.

  • Se encarga de coordinar qué servidores Kafka están activos.
  • Ayuda a Kafka a mantener alta disponibilidad.

👉 Kafka NO puede funcionar sin Zookeeper, porque lo necesita para gestionar los "brokers" (servidores Kafka).


📍 Arquitectura del Proyecto

📡 Esquema de comunicación entre Kafka y la aplicación

         [ Cliente - API REST ] 
                  │
                  ▼
       ┌──────────────────────┐
       │   PedidoController   │  (Recibe pedidos y los envía a Kafka)
       └──────────────────────┘
                  │
                  ▼
       ┌──────────────────────┐
       │   PedidoProducer     │  (Publica mensajes en Kafka)
       └──────────────────────┘
                  │
                  ▼
       ┌──────────────────────┐
       │       KAFKA          │  (Almacena los pedidos en un "topic")
       └──────────────────────┘
                  │
                  ▼
       ┌──────────────────────┐
       │   PedidoConsumer     │  (Recibe y procesa pedidos)
       └──────────────────────┘
                  │
                  ▼
        [ Notificación generada ]

📌 Explicación:
1️⃣ Un cliente envía un pedido mediante un POST /pedidos.
2️⃣ El Productor (Producer) lo envía a Kafka.
3️⃣ Kafka almacena el mensaje en un topic "pedidos".
4️⃣ El Consumidor (Consumer) recibe el mensaje y lo procesa.


🚀 Tecnologías Utilizadas

Tecnología Descripción
Spring Boot Framework para crear aplicaciones Java rápidamente
Apache Kafka Plataforma de mensajería en tiempo real
Zookeeper Coordina los servidores Kafka
Docker Contenedores para Kafka y Zookeeper
Maven Manejo de dependencias Java

🛠️ Instalación y Ejecución

1️⃣ Levantar Kafka y Zookeeper con Docker

docker-compose up -d

2️⃣ Ejecutar la aplicación Spring Boot

mvn spring-boot:run

3️⃣ Probar enviando un pedido

Usa Postman o cURL:

curl -X POST "http://localhost:8080/pedidos" -H "Content-Type: application/json" -d '{"producto": "Laptop", "cantidad": 2}'

📌 El consumidor recibirá el mensaje y lo imprimirá en consola.


📝 Explicación del Código

📄 Pedido.java (📌 Modelo de datos)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pedido {
    private String id;
    private String producto;
    private int cantidad;
}

📌 Representa un pedido con un id, producto y cantidad.


📄 PedidoProducer.java (📡 Productor Kafka)

@Service
@RequiredArgsConstructor
public class PedidoProducer {
    private final KafkaTemplate<String, Pedido> kafkaTemplate;
    private static final String TOPIC = "pedidos";

    public void enviarPedido(Pedido pedido) {
        kafkaTemplate.send(TOPIC, pedido);
    }
}

📌 Publica mensajes en Kafka en el topic pedidos.


📄 PedidoConsumer.java (📥 Consumidor Kafka)

@Service
public class PedidoConsumer {
    @KafkaListener(topics = "pedidos", groupId = "pedidos-group", containerFactory = "pedidoKafkaListenerContainerFactory")
    public void recibirPedido(Pedido pedido) {
        System.out.println("📦 Pedido recibido: " + pedido);
    }
}

📌 Escucha el topic pedidos y procesa los mensajes.


🔍 Comparación Kafka vs RabbitMQ vs ActiveMQ

Característica Kafka RabbitMQ ActiveMQ
Modelo Basado en logs distribuidos Mensajería clásica (cola) Mensajería clásica (cola)
Velocidad Muy rápido (millones de mensajes/seg) Medio Medio
Persistencia Sí, almacena eventos en logs Opcional Opcional
Escalabilidad Altísima, diseñado para Big Data Media Media
Casos de uso Streaming de datos en tiempo real Comunicación entre microservicios Aplicaciones empresariales

📌 Kafka es ideal para streaming de datos y Big Data.
📌 RabbitMQ y ActiveMQ son mejores para colas de mensajes tradicionales.


👨‍💻 Autor

📌 Creador: Carlos Exposito (Frody)
📌 GitHub: FirstOnDie
📌 Contacto: LinkedIn

About

Ejemplo con Kafka de una miniAPI de pedidos

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages