Spring Boot

SpringBoot

Tutorial SpringBoot: Crear proyecto con Apache Kafka

Configuración de application properties en Spring Boot para integrar Apache Kafka como middleware para mensajería asíncrona y escalar arquitecturas Spring Boot.

Aprende SpringBoot GRATIS y certifícate

Paso 1: datos del proyecto

En start.spring.io generamos un nuevo proyecto con Java, maven y Spring Boot:

Paso 2: seleccionar dependencias

Vamos a crear una aplicación web de Spring con Apache Kafka.

Dependencias:

  • Lombok
  • Spring Web
  • Spring Data JPA
  • H2 o MySQL
  • Apache Kafka

Paso 3: configurar logging

En desarrollo, puede ser interesante habilitar los logs de Kafka para ver la conexión y el envío y recepción de la información hacia los topics.

En application properties:

logging.level.org.apache.kafka=DEBUG

Paso 4: configuración de propiedades para Apache Kafka

Una vez creado y descargado el proyecto, lo abrimos con IntelliJ IDEA o nuestro IDE preferido.

En el archivo application.properties podemos configurar propiedades para personalizar:

  • Propiedades generales de kafka
  • Propiedades para los Producer
  • Propiedades para los Consumer

Incluso es común tener solo Producers en un proyecto y solo Consumers en otro proyecto. Normalmente habrá combinación de ambos en un mismo proyecto ya que en arquitecturas con múltiples aplicaciones Spring Boot se suele utilizar Apache Kafka como middleware para intercambiar información entre las distintas aplicaciones.

Para configurar una aplicación Spring Boot 3 para trabajar con Apache Kafka utilizando Producers, Consumers y Processors, es esencial definir correctamente diversas propiedades en el archivo application.properties. A continuación, se detallan todas las propiedades necesarias, organizadas por categorías, con una explicación de cada una y recomendaciones sobre los valores a asignar.

1. Configuración General de Kafka

Estas propiedades establecen la conexión básica y comportamientos generales de Kafka en la aplicación.

spring.kafka.bootstrap-servers

  • Descripción: Especifica la dirección(s) del/los broker(s) de Kafka a los que la aplicación se conectará.
  • Valor recomendado: Lista de direcciones y puertos de los brokers, separadas por comas.
  • Ejemplo:
  spring.kafka.bootstrap-servers=localhost:9092,localhost:9093

spring.kafka.client-id

  • Descripción: Identificador único para el cliente Kafka. Útil para el monitoreo y trazabilidad.
  • Valor recomendado: Un identificador descriptivo para la aplicación o componente.
  • Ejemplo:
  spring.kafka.client-id=my-kafka-client

spring.kafka.properties.*

  • Descripción: Permite configurar propiedades adicionales de Kafka que no están cubiertas por las propiedades de Spring Boot.
  • Valor recomendado: Según las necesidades específicas de la aplicación.
  • Ejemplo:
  spring.kafka.properties.security.protocol=SASL_SSL
  spring.kafka.properties.sasl.mechanism=PLAIN

2. Configuración de producers (Productores)

Estas propiedades configuran cómo los productores enviarán mensajes a Kafka.

spring.kafka.producer.key-serializer

  • Descripción: Clase encargada de serializar las claves de los mensajes.
  • Valor recomendado: org.apache.kafka.common.serialization.StringSerializer si las claves son cadenas de texto.
  • Ejemplo:
  spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer

spring.kafka.producer.value-serializer

  • Descripción: Clase encargada de serializar los valores de los mensajes.
  • Valor recomendado: org.apache.kafka.common.serialization.StringSerializer para valores de texto o org.springframework.kafka.support.serializer.JsonSerializer para objetos JSON.
  • Ejemplo:
  spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer

spring.kafka.producer.acks

  • Descripción: Define el nivel de reconocimiento que el productor requiere del broker.
  • Valores posibles: 0, 1, all (o -1).
    • 0: No espera reconocimiento.
    • 1: Espera que el líder confirme.
    • all: Espera que todos los réplicas confirmen.
  • Valor recomendado: all para mayor durabilidad.
  • Ejemplo:
  spring.kafka.producer.acks=all

spring.kafka.producer.retries

  • Descripción: Número de reintentos que realizará el productor en caso de fallo al enviar un mensaje.
  • Valor recomendado: Depende de la tolerancia a fallos, comúnmente 3.
  • Ejemplo:
  spring.kafka.producer.retries=3

spring.kafka.producer.batch-size

  • Descripción: Tamaño en bytes del lote de mensajes que el productor enviará en una sola solicitud.
  • Valor recomendado: 16384 (16 KB) es un valor predeterminado común.
  • Ejemplo:
  spring.kafka.producer.batch-size=16384

spring.kafka.producer.linger-ms

  • Descripción: Tiempo en milisegundos que el productor esperará antes de enviar un lote de mensajes.
  • Valor recomendado: 1 para baja latencia o mayor para mayor rendimiento.
  • Ejemplo:
  spring.kafka.producer.linger-ms=1

spring.kafka.producer.buffer-memory

  • Descripción: Cantidad total de memoria disponible para el buffer de mensajes del productor.
  • Valor recomendado: 33554432 (32 MB) es un valor predeterminado común.
  • Ejemplo:
  spring.kafka.producer.buffer-memory=33554432

3. Configuración de Consumers (Consumidores)

Estas propiedades configuran cómo los consumidores recibirán y procesarán mensajes de Kafka.

spring.kafka.consumer.group-id

  • Descripción: Identificador del grupo de consumidores al que pertenece este consumidor.
  • Valor recomendado: Nombre descriptivo del grupo, por ejemplo, my-group.
  • Ejemplo:
  spring.kafka.consumer.group-id=my-group

spring.kafka.consumer.auto-offset-reset

  • Descripción: Define qué hacer cuando no hay un offset inicial o el offset actual ya no es válido.
  • Valores posibles: earliest, latest, none.
    • earliest: Comienza a leer desde el inicio del log.
    • latest: Comienza a leer desde el último mensaje.
    • none: Lanza una excepción si no hay offset.
  • Valor recomendado: earliest para asegurarse de procesar todos los mensajes.
  • Ejemplo:
  spring.kafka.consumer.auto-offset-reset=earliest

spring.kafka.consumer.enable-auto-commit

  • Descripción: Habilita o deshabilita el auto-commit de los offsets.
  • Valor recomendado: false para gestionar manualmente los commits.
  • Ejemplo:
  spring.kafka.consumer.enable-auto-commit=false

spring.kafka.consumer.key-deserializer

  • Descripción: Clase encargada de deserializar las claves de los mensajes.
  • Valor recomendado: org.apache.kafka.common.serialization.StringDeserializer si las claves son cadenas de texto.
  • Ejemplo:
  spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer

spring.kafka.consumer.value-deserializer

  • Descripción: Clase encargada de deserializar los valores de los mensajes.
  • Valor recomendado: org.apache.kafka.common.serialization.StringDeserializer para valores de texto o org.springframework.kafka.support.serializer.JsonDeserializer para objetos JSON.
  • Ejemplo:
  spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer

spring.kafka.consumer.max-poll-records

  • Descripción: Número máximo de registros que el consumidor puede obtener en una sola llamada de polling.
  • Valor recomendado: 500 es un valor común, ajustable según la carga.
  • Ejemplo:
  spring.kafka.consumer.max-poll-records=500

spring.kafka.consumer.session.timeout-ms

  • Descripción: Tiempo máximo entre los latidos del consumidor para detectar fallos.
  • Valor recomendado: 15000 (15 segundos) es un valor predeterminado común.
  • Ejemplo:
  spring.kafka.consumer.session.timeout-ms=15000

4. Configuración de Processors (Procesadores)

Los Processors en Kafka Streams combinan características de Producers y Consumers, además de capacidades de procesamiento de flujos. A continuación, se presentan las propiedades esenciales para configurar Kafka Streams en Spring Boot.

spring.kafka.streams.application-id

  • Descripción: Identificador único de la aplicación de Kafka Streams.
  • Valor recomendado: Nombre descriptivo de la aplicación, por ejemplo, my-streams-app.
  • Ejemplo:
  spring.kafka.streams.application-id=my-streams-app

spring.kafka.streams.properties.default.key.serde

  • Descripción: Serde por defecto para las claves en los flujos.
  • Valor recomendado: org.apache.kafka.common.serialization.Serdes$StringSerde para cadenas de texto.
  • Ejemplo:
  spring.kafka.streams.properties.default.key.serde=org.apache.kafka.common.serialization.Serdes$StringSerde

spring.kafka.streams.properties.default.value.serde

  • Descripción: Serde por defecto para los valores en los flujos.
  • Valor recomendado: org.apache.kafka.common.serialization.Serdes$StringSerde para cadenas de texto o un Serde adecuado para otros tipos de datos.
  • Ejemplo:
  spring.kafka.streams.properties.default.value.serde=org.apache.kafka.common.serialization.Serdes$StringSerde

spring.kafka.streams.commit.interval.ms

  • Descripción: Intervalo de tiempo entre commits de offsets en Kafka Streams.
  • Valor recomendado: 1000 (1 segundo) es un valor común.
  • Ejemplo:
  spring.kafka.streams.commit.interval.ms=1000

spring.kafka.streams.cache.max.bytes.buffering

  • Descripción: Tamaño máximo del buffer de caché para operaciones de estado en Kafka Streams.
  • Valor recomendado: 10485760 (10 MB) es un valor predeterminado común.
  • Ejemplo:
  spring.kafka.streams.cache.max.bytes.buffering=10485760

spring.kafka.streams.processing.guarantee

  • Descripción: Define la garantía de procesamiento de la aplicación Kafka Streams.
  • Valores posibles: at_least_once o exactly_once.
  • Valor recomendado: exactly_once para asegurar la precisión en el procesamiento.
  • Ejemplo:
  spring.kafka.streams.processing.guarantee=exactly_once

5. Configuración de Seguridad (Opcional)

Si tu clúster de Kafka requiere seguridad, deberás configurar propiedades adicionales.

spring.kafka.security.protocol

  • Descripción: Protocolo de seguridad a usar.
  • Valores posibles: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL.
  • Valor recomendado: Según la configuración de tu clúster.
  • Ejemplo:
  spring.kafka.security.protocol=SASL_SSL

spring.kafka.properties.sasl.mechanism

  • Descripción: Mecanismo de autenticación SASL.
  • Valores posibles: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512, etc.
  • Valor recomendado: Según la configuración de tu clúster.
  • Ejemplo:
  spring.kafka.properties.sasl.mechanism=PLAIN

spring.kafka.properties.ssl.truststore.location

  • Descripción: Ruta al archivo de truststore SSL.
  • Valor recomendado: Ruta absoluta o relativa al archivo de truststore.
  • Ejemplo:
  spring.kafka.properties.ssl.truststore.location=/path/to/truststore.jks

spring.kafka.properties.ssl.truststore.password

  • Descripción: Contraseña para el truststore SSL.
  • Valor recomendado: Contraseña segura.
  • Ejemplo:
  spring.kafka.properties.ssl.truststore.password=changeit

6. Configuraciones adicionales

spring.kafka.listener.concurrency

  • Descripción: Número de hilos concurrentes para los listeners de Kafka.
  • Valor recomendado: Según los recursos disponibles y la carga esperada, por ejemplo, 3.
  • Ejemplo:
  spring.kafka.listener.concurrency=3

spring.kafka.listener.type

  • Descripción: Tipo de listener a utilizar.
  • Valores posibles: single, batch.
  • Valor recomendado: batch si se procesan mensajes en lotes.
  • Ejemplo:
  spring.kafka.listener.type=batch

spring.kafka.template.default-topic

  • Descripción: Tema por defecto para el KafkaTemplate si no se especifica otro.
  • Valor recomendado: Nombre del tema principal de producción.
  • Ejemplo:
  spring.kafka.template.default-topic=my-default-topic

spring.kafka.template.producer-properties.*

  • Descripción: Permite configurar propiedades específicas del productor para el KafkaTemplate.
  • Valor recomendado: Según las necesidades específicas, por ejemplo, configuraciones de seguridad.
  • Ejemplo:
  spring.kafka.template.producer-properties.security.protocol=SASL_SSL

7. Ejemplo completo de application.properties

A continuación, se presenta un ejemplo completo que integra las propiedades mencionadas anteriormente:

# Configuración General
spring.kafka.bootstrap-servers=localhost:9092,localhost:9093
spring.kafka.client-id=my-kafka-client

# Configuración de Producer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer
spring.kafka.producer.acks=all
spring.kafka.producer.retries=3
spring.kafka.producer.batch-size=16384
spring.kafka.producer.linger-ms=1
spring.kafka.producer.buffer-memory=33554432

# Configuración de Consumer
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.max-poll-records=500
spring.kafka.consumer.session.timeout-ms=15000

# Configuración de Kafka Streams (Processor)
spring.kafka.streams.application-id=my-streams-app
spring.kafka.streams.properties.default.key.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
spring.kafka.streams.properties.default.value.serde=org.apache.kafka.common.serialization.Serdes$StringSerde
spring.kafka.streams.commit.interval.ms=1000
spring.kafka.streams.cache.max.bytes.buffering=10485760
spring.kafka.streams.processing.guarantee=exactly_once

# Configuración de Seguridad (Opcional)
spring.kafka.security.protocol=SASL_SSL
spring.kafka.properties.sasl.mechanism=PLAIN
spring.kafka.properties.ssl.truststore.location=/path/to/truststore.jks
spring.kafka.properties.ssl.truststore.password=changeit

# Configuraciones Adicionales
spring.kafka.listener.concurrency=3
spring.kafka.listener.type=batch
spring.kafka.template.default-topic=my-default-topic
Aprende SpringBoot GRATIS online

Ejercicios de esta lección Crear proyecto con Apache Kafka

Evalúa tus conocimientos de esta lección Crear proyecto con Apache Kafka con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

API Query By Example (QBE)

Spring Boot
Test

Identificadores y relaciones JPA

Spring Boot
Puzzle

Borrar datos de base de datos

Spring Boot
Test

Web y Test Starters

Spring Boot
Puzzle

Métodos find en repositorios

Spring Boot
Test

Controladores Spring MVC

Spring Boot
Código

Inserción de datos

Spring Boot
Test

CRUD Customers Spring MVC + Spring Data JPA

Spring Boot
Proyecto

Backend API REST con Spring Boot

Spring Boot
Proyecto

Controladores Spring REST

Spring Boot
Código

Uso de Spring con Thymeleaf

Spring Boot
Puzzle

API Specification

Spring Boot
Puzzle

Registro de usuarios

Spring Boot
Test

Crear entidades JPA

Spring Boot
Código

Asociaciones en JPA

Spring Boot
Test

Asociaciones de entidades JPA

Spring Boot
Código

Integración con Vue

Spring Boot
Test

Consultas JPQL

Spring Boot
Código

Open API y cómo agregarlo en Spring Boot

Spring Boot
Puzzle

Uso de Controladores REST

Spring Boot
Puzzle

Repositorios reactivos

Spring Boot
Test

Inyección de dependencias

Spring Boot
Test

Introducción a Spring Boot

Spring Boot
Test

CRUD y JPA Repository

Spring Boot
Puzzle

Inyección de dependencias

Spring Boot
Código

Vista en Spring MVC con Thymeleaf

Spring Boot
Test

Servicios en Spring

Spring Boot
Código

Operadores Reactivos

Spring Boot
Puzzle

Configuración de Vue

Spring Boot
Puzzle

Entidades JPA

Spring Boot
Test

Integración con Angular

Spring Boot
Test

API Specification

Spring Boot
Test

API Query By Example (QBE)

Spring Boot
Puzzle

Controladores MVC

Spring Boot
Test

Anotaciones y mapeo en JPA

Spring Boot
Puzzle

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Test

Repositorios Spring Data

Spring Boot
Test

Inyección de dependencias

Spring Boot
Puzzle

Data JPA y Mail Starters

Spring Boot
Test

Configuración de Angular

Spring Boot
Puzzle

Controladores Spring REST

Spring Boot
Test

Configuración de Controladores MVC

Spring Boot
Puzzle

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Puzzle

Actualizar datos de base de datos

Spring Boot
Test

Verificar token JWT en peticiones

Spring Boot
Test

Login de usuarios

Spring Boot
Test

Integración con React

Spring Boot
Test

Configuración de React

Spring Boot
Puzzle

Todas las lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Web

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Web

Controladores Spring Rest

Spring Boot

Spring Web

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Web

Servicios En Spring

Spring Boot

Spring Web

Clientes Resttemplate Y Restclient

Spring Boot

Spring Web

Rxjava En Spring Web

Spring Boot

Spring Web

Crear Entidades Jpa

Spring Boot

Persistencia Spring Data

Asociaciones De Entidades Jpa

Spring Boot

Persistencia Spring Data

Repositorios Spring Data

Spring Boot

Persistencia Spring Data

Métodos Find En Repositorios

Spring Boot

Persistencia Spring Data

Inserción De Datos

Spring Boot

Persistencia Spring Data

Actualizar Datos De Base De Datos

Spring Boot

Persistencia Spring Data

Borrar Datos De Base De Datos

Spring Boot

Persistencia Spring Data

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Persistencia Spring Data

Api Query By Example (Qbe)

Spring Boot

Persistencia Spring Data

Api Specification

Spring Boot

Persistencia Spring Data

Repositorios Reactivos

Spring Boot

Persistencia Spring Data

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Rest Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Rest Reactivo Funcional

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario En Mvc Con Thymeleaf

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios

Spring Boot

Seguridad Con Spring Security

Login De Usuarios

Spring Boot

Seguridad Con Spring Security

Verificar Token Jwt En Peticiones

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Spring Web

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

En esta lección

Objetivos de aprendizaje de esta lección