En este artículo aprenderemos de forma práctica a enviar y recibir mensajes aplicando un patrón de productor y consumidor. Para ello vamos a utilizar Apache kafka como protocolo de comunicación y Azure Event Hub como plataforma de streaming de datos y servicio de ingesta de eventos.
¿Qué ofrece Azure Event Hubs para Kafka?
Event Hubs es un servicio administrado de Azure. Ofrece una plataforma distribuida de ingesta de eventos y streaming de datos. La comunicación con Event Hubs puede hacerse por medio de los siguientes protocolos de comunicación: HTTP, AMQP y el que nos interesa; Apache Kafka.
Event Hubs es compatible con los clientes creados para Apache Kafka 1.0 y versiones posteriores, y admite tanto la lectura como la escritura en Event Hubs (topics).
Las plataformas Apache Kafka y Event Hub son conceptualmente muy similares. La siguiente tabla relaciona los conceptos que se manejan en cada una de ellas:
Apache Kafka | Event Hubs |
Cluster | namespace |
Topic | Event Hub |
Partition | Partition |
Consumer group | Consumer group |
Offset | Offset |
En cuanto a la seguridad, el uso del protocolo Apache Kafka permite configurar la autenticación y el cifrado de los datos mediante mecanismos de SASL. El uso de Event Hubs para Kafka exige cifrado TLS para los datos en tránsito. En cuanto a las opciones disponibles para autorizar el acceso a los recursos de Azure Event Hubs, podemos optar por:
- OAuth 2.0
- Shared Access Signature (SAS)
Aunque por razones de seguridad la opción recomendada es OAuth 2.0, en nuestro caso práctico vamos a utilizar SAS para simplificar el ejercicio.
¿Listo para comenzar con la parte práctica? ¡vamos a ello!
Paso 1: Crea un namespace en Event Hubs
Recuerda que debes disponer de una suscripción en Azure para poder crear recursos. Si no tienes una, crea una cuenta gratuita antes de empezar.
1- Inicia sesión en Azure Portal
2- Si fuera necesario, crea un grupo de recursos donde ubicar Event Hubs
3- Click en crear nuevo recurso y busca en el marketplace de servicio por “Event Hubs”. Cuando lo localices pulsa en el botón “create”
4- En la página «Create Namespace», rellena todos los campos teniendo en cuenta lo siguiente:
- Namespace name: El nombre debe ser único por lo que el sistema realizará una comprobación automática para ver si está disponible.
- Pricing tier: Selecciona la tarifa estándar ya que es la única que permite habilitar el protocolo Apache Kafka para comunicar con Event Hubs.
5- Click en el botón “Review + create”, verifica que la configuración es correcta y pincha después sobre el botón “Create” para crear el recurso.
6- Para conectar los clientes Kafka con Event Hubs vamos a necesitar la siguiente información:
- FQDN del namespace:servicebus.windows.net
- Cadena de conexión: Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXXXXXXXXX».
Puedes localizar la cadena de conexión siguiendo los pasos que se indican en la siguiente imagen:
Paso 2: Descarga el proyecto de ejemplo
Para simplificar el proceso de implementación del productor y consumidor Kafka, vamos a utilizar un proyecto de ejemplo de Azure, el cual puedes descargar o clonar en tu entorno local:
https://github.com/Azure/azure-event-hubs-for-kafka.git
En el proyecto git hay hay implementaciones tanto del productor como del consumidor en diferentes lenguajes de programación. En nuestro caso nos vamos a utilizar la de java.
cd azure-event-hubs-for-kafka/quickstart/java
Te animo a revisar el código fuente y familiarizarte con la manera en la que se realiza el envío y consumo de mensajes con Apache Kafka a través de Event Hubs.
Paso 3: Productor
El productor incorpora un cliente Kafka utilizado para enviar mensajes a un Event Hub (topic). Observa que en el fichero pom.xml se incluye la dependencia del cliente Kafka:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.0</version>
</dependency>
La configuración del cliente Kafka se obtiene del fichero producer.config donde se establece la siguiente información:
- bootstrap.servers: FQDN del namespace de Event Hubs
- security.protocol: Todos los datos en tránsito con Events Hubs deben estar cifrados con TLS, por ello se debe especificar la opción SASL_SSL en esta propiedad.
- sasl.mechanism: Mecanismo de autenticación. Puede ser OAuth 2.0 (OAUTHBEARER) o SAS (PLAIN)
- sasl.jaas.config: Configuración de la cadena de conexión al namespace de Event Hubs
Por tanto, para nuestro ejemplo, la configuración del productor quedaría de la siguiente manera
bootstrap.servers=namespacercp.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespacercp.servicebus.windows.net/;SharedAccessKeyName=XXX;SharedAccessKey=XXXXXX";
Por defecto, el productor kafka está configurado para publicar mensajes en un Event Hub (topic) llamado test. Si quieres publicar mensajes en un topic diferente, tendrás que modificar la siguiente constante en la clase TestProducer:
private final static String TOPIC = "test";
Ejecuta el productor, comprueba que se conecta correctamente a Event Hubs y comienza a publicar mensajes:
mvn clean package
mvn exec:java -Dexec.mainClass="TestProducer"
Paso 4: Consumidor
El objetivo del consumidor es suscribirse a un Event Hub (topic) para recibir los mensajes publicados por nuestro productor haciendo uso de un cliente Kafka.
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.0</version>
</dependency>
La configuración del cliente Kafka se obtiene del fichero producer.config:
bootstrap.servers=namespacercp.servicebus.windows.net:9093
group.id=$Default
request.timeout.ms=60000
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespacercp.servicebus.windows.net/;SharedAccessKeyName=XXXX;SharedAccessKey=XXXXX";
Al igual que el productor, el consumidor está configurado para suscribirse al tópico test. Si quieres modificar el nombre del tópico, tendrás que modificar la siguiente constante en la clase TestConsumer:
private final static String TOPIC = "test";
Por ultimo ejecuta el consumidor y observa como empieza a recibir los mensajes publicados en Event Hubs por nuestro productor Kafka:
mvn clean package
mvn exec:java -Dexec.mainClass="TestConsumer"
Si te resulta de interés, tienes la opción de acceder a Event hubs y revisar las métricas de generadas:
No responses yet