À propos de cet atelier de programmation
1. Introduction
Cet atelier de programmation est un guide par étapes qui explique comment migrer des applications d'Apache Kafka vers Google Cloud Pubsub à l'aide de l'approche de migration par étapes.
Pour en savoir plus sur les différences entre Kafka et Pubsub, et sur l'approche de migration par étapes, cliquez ici.
Ce que vous allez faire
Dans cette démonstration, vous allez:
- Configurer un cluster Kafka autogéré sur GCE
- Déployer une application Kafka simple qui diffuse des chaînes aléatoires
- Configurer Pub/Sub
- Migrer de Kafka vers Pubsub à l'aide du connecteur Kafka pour Pub/Sub
Points abordés
- Configurer un cluster Kafka autogéré sur GCE
- Migrer une application Kafka vers une application Pub/Sub
Prérequis
- Accédez à Google Cloud Platform (avec des autorisations d'écriture pour BigQuery et Pub/Sub).
- gcloud CLI installée.
- Java 8 ou version ultérieure installé.
Coût
Dans ce document, vous utiliserez les produits/services facturables suivants:
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
2. Configurer Kafka
Dans cet atelier de programmation, nous allons démarrer Kafka à l'aide de ZooKeeper. Java 8 ou version ultérieure doit être installé dans votre environnement local.
1. Installer Kafka
Téléchargez Kafka et extrayez-le. Pour ce faire, nous vous recommandons d'effectuer le téléchargement binaire:
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. Démarrer zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
3. Démarrer le courtier
Pour démarrer l'agent de service Kafka, ouvrez une autre session de terminal et exécutez la commande suivante:
bin/kafka-server-start.sh config/server.properties
4. Créer un sujet Kafka
Créez un sujet Kafka pour l'application Kafka, ouvrez une nouvelle session de terminal et exécutez la commande suivante:
export TOPIC= "my-topic"
bin/kafka-topics.sh --create --topic $TOPIC --bootstrap-server localhost:9092
5. Confirmer la création des sujets
bin/kafka-topics.sh --describe --topic $TOPIC --bootstrap-server localhost:9092
Le résultat de la commande cmd ci-dessus doit ressembler à ce qui suit:
Topic: my-topic TopicId: gf4ena9rSmyQXMTDj1bBmQ PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: my-topic Partition: 0 Leader: 0 Replicas: 0 Isr: 0
3. Créer une application Kafka
Dans cet atelier de programmation, nous allons créer une application Java Kafka avec un producteur et deux clients. Le producteur envoie régulièrement des chaînes aléatoires et un code temporel à un sujet kafka.
Pour illustrer la migration par étapes, nous allons créer deux clients pour cette application.
- Consommateur 1 - affiche les messages lus
- Consommateur 2 – Écrit les messages dans BigQuery
Ouvrez un nouveau terminal et exécutez les commandes suivantes. N'exécutez pas ces commandes dans le répertoire de téléchargement Kafka.
1. Définir des variables constantes
export PROJECT_ID="<your project id>"
export DATASET_ID="<dataset name>"
export TABLE_ID="<table name>"
export TOPIC="my-topic"
2. Télécharger l'application Kafka src
git clone https://github.com/itodotimothy6/kafka-to-pubsub-demo.git
cd kafka-to-pubsub-demo
3. Configurer et authentifier gcloud
gcloud config set project $PROJECT_ID
gcloud auth application-default login
gcloud services enable bigquery.googleapis.com
4. Créer une table BigQuery
Cette table est utilisée par le deuxième consommateur pour écrire la sortie. La définition du schéma de la table est "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. Exécuter le producteur pour commencer à envoyer des messages au sujet
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaProducer" \
-Dexec.args="$TOPIC"
Les journaux de sortie doivent ressembler à ceci:
...
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. Exécuter le premier consommateur qui déconnecte les messages du sujet vers la console
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaConsumer1" \
-Dexec.args="$TOPIC"
Les journaux de sortie doivent ressembler à ceci:
...
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. Exécuter le deuxième client qui écrit les messages du sujet kafka dans une table BigQuery
mvn clean install
mvn exec:java \
-Dexec.mainClass="org.kafka.SimpleKafkaConsumer2" \
-Dexec.args="$TOPIC $PROJECT_ID $DATASET_ID $TABLE_ID"
Les journaux de sortie doivent ressembler à ceci:
...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...
8. Vérifier que les messages sont bien écrits dans BigQuery à partir de la console GCP
4. Configurer Pub/Sub
1. Activer Pub/Sub
gcloud services enable pubsub.googleapis.com
2. Créer un sujet Pub/Sub
Ce sujet remplacera à terme le sujet kafka. Pour plus de simplicité, nous pouvons utiliser le même nom que le sujet "kafka".
export TOPIC = "my-topic"
gcloud pubsub topics create $TOPIC
5. Migration par étapes
Maintenant que nous avons configuré notre application Kafka et que nous disposons d'un sujet Pub/Sub pour la migration, nous allons procéder à la migration de Kafka vers Pub/Sub.
Dans cette démonstration de migration, nous utiliserons le connecteur Kafka du groupe Google Cloud Pub/Sub, qui vous permet de migrer votre infrastructure Kafka par phases.
Phase 1
Configurer le connecteur Pub/Sub pour transférer tous les messages du sujet Kafka vers le sujet Pub/Sub
1. Procurez-vous le fichier JAR du connecteur Kafka-to-pubsub en créant le dépôt du connecteur.
git clone https://github.com/googleapis/java-pubsub-group-kafka-connector
cd java-pubsub-group-kafka-connector/
mvn clean package -DskipTests=True
Si l'opération réussit, le fichier jar obtenu devrait s'afficher à l'adresse target/pubsub-group-kafka-connector-${VERSION}.jar
.
Créez une variable avec le chemin d'accès complet au fichier JAR.
export KAFKA_CONNECT_JAR="path/to/target/pubsub-group-kafka-connector-${VERSION}.jar"
2. Mettre à jour les configurations Kafka installées avec les configurations Kafka Connect
Remplacez le répertoire par votre dossier de téléchargement kafka précédent.
cd kafka_2.13-3.5.1
Ouvrez /config/connect-standalone.properties
dans le dossier de téléchargement Kafka et ajoutez le chemin d'accès du fichier JAR téléchargé à plugin.path et annulez la mise en commentaire de la ligne si nécessaire. Vous pouvez également exécuter la commande cmd ci-dessous
echo "plugin.path=$KAFKA_CONNECT_JAR" >> config/connect-standalone.properties
3. Créez un fichier de configuration CloudPubSubSinkConnector
avec le sujet Kafka, le projet Pub/Sub et le sujet Pub/Sub nécessaires à la migration. Consultez l'exemple du CloudPubSubSinkConnector
fichier de configuration ici.
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. Démarrez le connecteur pour commencer à transférer les messages du sujet Kafka vers Pub/Sub.
bin/connect-standalone.sh \
config/connect-standalone.properties \
config/cps-sink-connector.properties
Vérifier dans la console GCP que les messages sont transférés vers votre sujet Pub/Sub
Phase 2
Mettez à jour les applications consommateur pour recevoir des messages du sujet Pub/Sub pendant que votre producteur continue de publier des messages sur Kafka.
1. Mettez à jour le client qui affiche les messages dans la console pour vous abonner à Pub/Sub. Dans l'exemple kafka-to-pubsub-demo
src, SimplePubsubscriber1
est mis à jour pour lire les données du sujet Pub/Sub.
Créer un abonnement Pub/Sub
export SUBSCRIPTION_ID="sub1"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC
Exécuter l'application d'abonné mise à jour
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubSubscriber1" \
-Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID"
Les journaux de sortie doivent ressembler à ceci :
...
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. Mettez à jour le client qui écrit dans BigQuery pour vous abonner à Pub/Sub. Dans l'exemple kafka-to-pubsub-demo
src, SimplePubsubscriber1
est mis à jour pour lire les données du sujet Pub/Sub.
Créer un abonnement Pub/Sub
export SUBSCRIPTION_ID="sub2"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC
Exécuter l'application d'abonné mise à jour
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubSubscriber2" \
-Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID $DATASET_ID $TABLE_ID"
Les journaux de sortie doivent ressembler à ceci :
...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...
Phase 3
Mettre à jour vos producteurs pour publier directement dans Pub/Sub
- Mettez à jour l'attribut "src" du producteur Kafka pour qu'il écrive dans Pub/Sub au lieu de Kafka. Dans l'exemple de code src
kafka-to-pubsub-demo
,SimplePubsubPublisher
est mis à jour de manière à envoyer des messages au sujet Pub/Sub. - Arrêtez le connecteur. Pour arrêter le connecteur, arrêtez le connecteur en cours d'exécution dans la session de terminal kafka-connect.
- Exécuter l'application d'éditeur mise à jour
cd kafka-to-pubsub-demo
mvn exec:java \
-Dexec.mainClass="org.pubsub.SimplePubsubPublisher" \
-Dexec.args="$PROJECT_ID $TOPIC"
6. Félicitations
Félicitations ! Vous avez terminé l'atelier de programmation sur la migration des applications Kafka autogérées vers Pub/Sub.
Voici quelques liens pour en savoir plus