Acerca de este codelab
1. Introducción
Este codelab es una guía paso a paso para demostrar la migración de aplicaciones de Apache Kafka a Google Cloud Pub/Sub con el enfoque de migración por fases.
Puede obtener más información sobre las diferencias entre Kafka y Pub/Sub y el enfoque de migración en etapas aquí.
Qué compilarás
En esta demostración, harás lo siguiente:
- Configura un clúster de Kafka autoadministrado en GCE
- Implementa una aplicación de Kafka simple que transmita cadenas aleatorias
- Configura Pub/Sub
- Migra de Kafka a Pub/Sub con el conector de Kafka de Pub/Sub
Qué aprenderás
- Cómo configurar un clúster de Kafka autoadministrado en GCE
- Cómo migrar una aplicación de Kafka a una aplicación de Pub/Sub
Requisitos
- Acceder a Google Cloud Platform (con permisos de escritura para BigQuery y Pub/Sub)
- CLI de gcloud instalada
- Java 8 o superior instalado.
Costo
En este documento, utilizarás los siguientes productos o servicios facturables:
Para generar una estimación de costos en función del uso proyectado, usa la calculadora de precios.
2. Configura Kafka
En este codelab, iniciaremos Kafka con ZooKeeper. Tu entorno local debe tener instalado Java 8 o superior.
1. Instala Kafka
Descarga Kafka y extráelo. Recomienda la descarga binaria para continuar:
curl -O https://downloads.apache.org/kafka/3.5.1/kafka_2.13-3.5.1.tgz
tar -xzf kafka_2.13-3.5.1.tgz
cd kafka_2.13-3.5.1
2. Iniciar zoológico
bin/zookeeper-server-start.sh config/zookeeper.properties
3. Iniciar agente
Para iniciar el servicio del agente de Kafka, abre otra sesión de la terminal y ejecuta lo siguiente:
bin/kafka-server-start.sh config/server.properties
4. Crear tema kafka
Crea un tema de Kafka para la aplicación de Kafka, abre una nueva sesión de la terminal y ejecuta lo siguiente:
export TOPIC= "my-topic"
bin/kafka-topics.sh --create --topic $TOPIC --bootstrap-server localhost:9092
5. Confirma la creación de un tema
bin/kafka-topics.sh --describe --topic $TOPIC --bootstrap-server localhost:9092
El resultado del cmd anterior debería ser similar al siguiente:
Topic: my-topic TopicId: gf4ena9rSmyQXMTDj1bBmQ PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: my-topic Partition: 0 Leader: 0 Replicas: 0 Isr: 0
3. Crea una aplicación de Kafka
En este codelab, crearemos una aplicación Java kafka que tiene 1 productor y 2 consumidores. El productor envía periódicamente cadenas aleatorias y una marca de tiempo a un tema kafka.
Para demostrar la migración por fases, crearemos 2 consumidores para esta aplicación.
- Consumidor 1: imprime los mensajes leídos
- Consumidor 2: escribe los mensajes en BigQuery
Abre una terminal nueva y ejecuta los siguientes comandos. No ejecute estos comandos en el directorio de descarga de Kafka
1. Cómo configurar variables constantes
export PROJECT_ID="<your project id>"
export DATASET_ID="<dataset name>"
export TABLE_ID="<table name>"
export TOPIC="my-topic"
2. Descarga la aplicación de Kafka src
git clone https://github.com/itodotimothy6/kafka-to-pubsub-demo.git
cd kafka-to-pubsub-demo
3. Configura y autentica gcloud
gcloud config set project $PROJECT_ID
gcloud auth application-default login
gcloud services enable bigquery.googleapis.com
4. Crea una tabla de BigQuery
El segundo consumidor usa esta tabla para escribir el resultado. La definición del esquema de la tabla es “message:STRING, timestamp:STRING”.
bq mk --dataset --data_location US $PROJECT_ID:$DATASET_ID
bq mk --table $PROJECT_ID:$DATASET_ID.$TABLE_ID message:STRING,timestamp:STRING
5. Ejecuta el productor para comenzar a enviar mensajes al tema
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaProducer" \
-Dexec.args="$TOPIC"
Los registros de resultado deberían ser similares a los siguientes:
...
Message sent: {"message":"283b7961-44cd-46d4-9061-5a22b8a1bdd7","timestamp":"2023-09-15 12:17:09"}
Message sent: {"message":"e4c2110a-ebbe-4c96-88d1-56ffdc2a3e9a","timestamp":"2023-09-15 12:17:14"}
...
6. Ejecuta el primer consumidor que cierra la sesión de los mensajes del tema en la consola.
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaConsumer1" \
-Dexec.args="$TOPIC"
Los registros de resultado deberían ser similares a los siguientes:
...
Received message: {"message":"72d46b42-5014-4d28-a6e3-04b65de63826","timestamp":"2023-09-15 12:32:47"}
Received message: {"message":"631464dc-2651-4cce-826f-c9442beb3e98","timestamp":"2023-09-15 12:32:52"}
...
7. Ejecuta el segundo consumidor que escribe mensajes del tema kafka en una tabla de BigQuery
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaConsumer2" \
-Dexec.args="$TOPIC $PROJECT_ID $DATASET_ID $TABLE_ID"
Los registros de resultado deberían ser similares a los siguientes:
...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...
8. Confirmar que los mensajes se escriben correctamente en BigQuery desde la consola de GCP
4. Configura Pub/Sub
1. Habilita Pub/Sub
gcloud services enable pubsub.googleapis.com
2. Crear tema de Pub/Sub
Con el tiempo, este tema reemplazará al tema kafka. Para simplificar, podemos usar el mismo nombre que el tema kafka.
export TOPIC = "my-topic"
gcloud pubsub topics create $TOPIC
5. Migración por fases
Ahora que configuramos nuestra aplicación de Kafka y tenemos un tema de Pub/Sub para la migración, procederemos con la migración de Kafka a Pub/Sub.
En esta demostración de migración, usaremos el conector de Kafka de Pub/Sub del grupo de Google Cloud Pub/Sub, que te permite migrar tu infraestructura de Kafka en etapas.
Fase 1
Configurar el conector de Pub/Sub para reenviar todos los mensajes del tema de Kafka al tema de Pub/Sub
1. Compila el repositorio del conector para adquirir el jar del conector kafka-to-pubsub.
git clone https://github.com/googleapis/java-pubsub-group-kafka-connector
cd java-pubsub-group-kafka-connector/
mvn clean package -DskipTests=True
Deberías ver el jar resultante en target/pubsub-group-kafka-connector-${VERSION}.jar
si la operación es exitosa.
Crea una variable con la ruta de acceso completa al jar.
export KAFKA_CONNECT_JAR="path/to/target/pubsub-group-kafka-connector-${VERSION}.jar"
2. Actualice los parámetros de configuración de Kafka que tiene instaladas con los parámetros de configuración de Kafka Connect
Cambia el directorio a tu carpeta de descarga de Kafka que usaste anteriormente.
cd kafka_2.13-3.5.1
Abre /config/connect-standalone.properties
en la carpeta de descarga de Kafka, agrega la ruta de acceso al archivo del jar del conector descargado a plugin.path y quita el comentario de la línea si es necesario. Como alternativa, puedes ejecutar el siguiente comando
echo "plugin.path=$KAFKA_CONNECT_JAR" >> config/connect-standalone.properties
3. Crea un archivo de configuración CloudPubSubSinkConnector
con el tema kafka, el proyecto y el tema de Pub/Sub necesarios para la migración. Consulta el archivo de configuración aquí de ejemplo.CloudPubSubSinkConnector
cat <<EOF > config/cps-sink-connector.properties
name=CPSSinkConnector
connector.class=com.google.pubsub.kafka.sink.CloudPubSubSinkConnector
tasks.max=10
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.converters.ByteArrayConverter
topics=$TOPIC
cps.project=$PROJECT_ID
cps.topic=$TOPIC
EOF
4. Inicia el conector para comenzar a reenviar mensajes del tema de Kafka a Pub/Sub.
bin/connect-standalone.sh \
config/connect-standalone.properties \
config/cps-sink-connector.properties
Confirma en GCP Console que los mensajes se estén reenviando a tu tema de Pub/Sub
Fase 2
Actualizar las aplicaciones de consumidor para recibir mensajes del tema de Pub/Sub mientras el productor sigue publicando mensajes en Kafka
1. Actualiza el consumidor que imprime mensajes en la consola para suscribirse a Pub/Sub. En la muestra kafka-to-pubsub-demo
src, SimplePubsubscriber1
se actualiza para leer desde el tema de Pub/Sub.
Cómo crear una suscripción de Pub/Sub
export SUBSCRIPTION_ID="sub1"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC
Ejecuta una aplicación suscriptora actualizada
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubSubscriber1" \
-Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID"
Los registros de salida deberían ser similares a
...
Id: 8827699929893588
Data: {"message":"08afe1db-2ace-466d-bcf9-77ffc80a7f58","timestamp":"2023-09-15 15:57:34"}
Id: 8827853608001203
Data: {"message":"557960f7-5f2e-4156-84de-e270127c99de","timestamp":"2023-09-15 15:57:39"}
...
2. Actualizar el consumidor que escribe en BigQuery para suscribirse a Pub/Sub En la muestra kafka-to-pubsub-demo
src, SimplePubsubscriber1
se actualiza para leer desde el tema de Pub/Sub.
Cómo crear una suscripción de Pub/Sub
export SUBSCRIPTION_ID="sub2"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC
Ejecuta una aplicación suscriptora actualizada
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubSubscriber2" \
-Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID $DATASET_ID $TABLE_ID"
Los registros de salida deberían ser similares a
...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...
Fase 3
Actualiza tus productores para publicar directamente en Pub/Sub
- Actualiza el src del productor de Kafka para que escriba en Pub/Sub en lugar de Kafka. En el src de
kafka-to-pubsub-demo
de muestra, se actualizaSimplePubsubPublisher
para enviar mensajes al tema de Pub/Sub. - Detén el conector. Para detener el conector, cierra el conector en ejecución en la sesión de la terminal de kafka-connect
- Ejecuta la aplicación del publicador actualizada
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubPublisher" \
-Dexec.args="$PROJECT_ID $TOPIC"
6. Felicitaciones
Felicitaciones, completaste correctamente el codelab para migrar aplicaciones autoadministradas de Kafka a Pub/Sub.
Aquí tienes algunos vínculos para obtener más información