Introducción

En Apache Kafka, los temas y las particiones son conceptos fundamentales que permiten la organización y distribución de datos. Comprender cómo funcionan es crucial para diseñar sistemas eficientes y escalables.

¿Qué es un Tema?

Un tema en Kafka es una categoría o un canal de datos al que los productores envían mensajes y del que los consumidores leen mensajes. Los temas son la unidad lógica de organización de los datos en Kafka.

Características de los Temas:

  • Nombre del Tema: Cada tema tiene un nombre único dentro del clúster de Kafka.
  • Persistencia: Los mensajes en un tema se almacenan de manera persistente en el disco.
  • Retención: Los mensajes se retienen durante un período configurado, después del cual se eliminan.

¿Qué es una Partición?

Una partición es una subdivisión de un tema. Cada tema puede tener una o más particiones, y cada partición es una secuencia ordenada e inmutable de registros que se asigna a un solo broker.

Características de las Particiones:

  • Orden: Los mensajes dentro de una partición están ordenados por su desplazamiento (offset).
  • Paralelismo: Las particiones permiten el paralelismo, ya que múltiples consumidores pueden leer de diferentes particiones simultáneamente.
  • Replicación: Las particiones pueden ser replicadas en múltiples brokers para tolerancia a fallos.

Ejemplo Práctico

Supongamos que tenemos un tema llamado orders que se utiliza para registrar pedidos en una tienda en línea. Este tema puede tener varias particiones para manejar un gran volumen de pedidos.

Tema: orders
Particiones: 3

Distribución de Mensajes en Particiones

Cuando un productor envía un mensaje al tema orders, Kafka decide en qué partición almacenar el mensaje. Esta decisión puede basarse en:

  • Round-robin: Distribuir mensajes de manera uniforme entre las particiones.
  • Clave de Partición: Utilizar una clave específica para determinar la partición (por ejemplo, el ID del cliente).
// Ejemplo de productor en Java
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

String topic = "orders";
String key = "customer123"; // Clave de partición
String value = "order details";

ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
producer.send(record);

producer.close();

En este ejemplo, el mensaje se enviará a una partición específica basada en la clave customer123.

Ejercicio Práctico

Ejercicio 1: Crear un Tema con Múltiples Particiones

  1. Objetivo: Crear un tema llamado user-activity con 4 particiones.
  2. Instrucciones:
    • Utiliza la herramienta de línea de comandos de Kafka para crear el tema.
    • Verifica que el tema se ha creado correctamente.
# Crear el tema
kafka-topics.sh --create --topic user-activity --bootstrap-server localhost:9092 --partitions 4 --replication-factor 1

# Verificar el tema
kafka-topics.sh --describe --topic user-activity --bootstrap-server localhost:9092

Ejercicio 2: Enviar Mensajes a un Tema con Particiones

  1. Objetivo: Enviar mensajes al tema user-activity utilizando una clave de partición.
  2. Instrucciones:
    • Escribe un productor en Java que envíe mensajes al tema user-activity.
    • Utiliza diferentes claves para enviar mensajes a diferentes particiones.
// Ejemplo de productor en Java
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

String topic = "user-activity";

for (int i = 0; i < 10; i++) {
    String key = "user" + (i % 4); // Clave de partición
    String value = "activity" + i;

    ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
    producer.send(record);
}

producer.close();

Conclusión

En esta sección, hemos aprendido sobre los temas y las particiones en Kafka, cómo se organizan y distribuyen los datos, y cómo se pueden utilizar para lograr un alto rendimiento y escalabilidad. Estos conceptos son fundamentales para trabajar eficazmente con Kafka y diseñar sistemas robustos.

En el próximo módulo, exploraremos los brokers y clústeres de Kafka, y cómo estos componentes trabajan juntos para proporcionar una plataforma de mensajería distribuida y tolerante a fallos.

© Copyright 2024. Todos los derechos reservados