Iscriversi agli eventi dell' Kafka
Con questo tutorial potrai imparare come sottoscrivere eventi di un Kafka e utilizzando la CLI di IBM Cloud® Code Engine.
Spesso, in ambienti distribuiti, si desidera che le applicazioni o i lavori reagiscano ai messaggi (eventi) generati da altri componenti, generalmente denominati produttori di eventi. Con Code Engine, le tue applicazioni o i tuoi processi possono ricevere gli eventi di interesse iscrivendosi ai generatori di eventi. Le informazioni relative agli eventi vengono ricevute sotto forma di richieste POST all'indirizzo HTTP per le applicazioni e sotto forma di variabili d'ambiente per i processi.
Il produttore eventi Kafka controlla la presenza di nuovi messaggi in un'istanza Kafka. Quando crei una sottoscrizione Code Engine Kafka per una serie di argomenti, la tua applicazione o lavoro riceve un evento separato per ogni nuovo messaggio che viene visualizzato in uno degli argomenti.
Sebbene sia possibile utilizzare qualsiasi istanza di Kafka, gli esempi riportati in questo tutorial utilizzano il servizio IBM® Event Streams for IBM Cloud®. Event Streams è un servizio di streaming di eventi IBM per eventi Kafka. Per ulteriori informazioni su questo servizio, consultare la documentazione su Event Streams.
Prima di iniziare
- Configura il tuo ambiente CLI Code Engine.
- Configura la tua CLI Event Streams.
- Creare e utilizzare un progetto.
Tutti gli utenti di Code Engine devono disporre di un account Pay-as-you-Go. Le esercitazioni potrebbero comportare dei costi. Utilizza lo Strumento di stima dei costi per generare una stima dei costi in base al tuo utilizzo previsto. Per ulteriori informazioni, consulta la pagina dedicata ai prezzi di Code Engine.
Configurazione del produttore eventi Kafka
È possibile configurare il proprio generatore di messaggi " Kafka " in modo che invii messaggi alle sottoscrizioni agli eventi " Code Engine " e " Kafka ". Utilizza la sottoscrizione all'evento Code Engine Kafka per attivare applicazioni o processi quando viene ricevuto un messaggio Kafka.
Per iniziare, crea un'istanza del servizio Event Streams per il tuo servizio Event Streaming. Mentre puoi utilizzare la console o la CLI, i seguenti passi descrivono come configurare il produttore di eventi Event Streams con la CLI.
-
Crea un'istanza del servizio per Event Streams. Il nome del servizio CLI Event Streams è
messagehub. Per questo esempio, crea un'istanza del servizio Event Streams denominatamyeventstream.ibmcloud resource service-instance-create myeventstream messagehub lite us-south -
Crea una chiave del servizio per fornire le credenziali alla tua istanza del servizio.
ibmcloud resource service-key-create myeventstream-key Manager --instance-name myeventstreamOutput di esempio
Creating service key of service instance myeventstream under account <user_account>... OK Service key crn:v1:bluemix:public:messagehub:us-south:a/e43abfcbd191404cb17ef650e9681dd3:c0736069-3f4a-438a-b614-6846877d692d:resource-key:4c8edfdb-abcd-abcd-abcd-abcdabcdabcd was created. Name: myeventstream-key ID: crn:v1:bluemix:public:messagehub:us-south:a/e43abfcbd191404cb17ef650e9681dd3:c0736069-3f4a-438a-b614-6846877d692d:resource-key:4c8edfdb-abcd-abcd-abcd-abcdabcdabcd Created At: Mon Mar 21 18:36:09 UTC 2022 State: active Credentials: api_key: abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh apikey: abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh iam_apikey_description: Auto-generated for key crn:v1:bluemix:public:messagehub:us-south:a/e43abfcbd191404cb17ef650e9681dd3:c0736069-3f4a-438a-b614-6846877d692d:resource-key:4c8edfdb-abcd-abcd-abcd-abcdabcdabcd iam_apikey_name: myeventstream-key iam_role_crn: crn:v1:bluemix:public:iam::::serviceRole:Manager iam_serviceid_crn: crn:v1:bluemix:public:iam-identity::a/e43abfcbd191404cb17ef650e9681dd3::serviceid:ServiceId-3e99caa5-b174-4f04-9845-5c5d783b8bc7 instance_id: c0736069-3f4a-438a-b614-6846877d692d kafka_admin_url: https://abcdabcdabcdabcd.svc07.us-south.eventstreams.cloud.ibm.com kafka_brokers_sasl: [broker-1-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-2-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-5-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-3-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-4-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-0-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093] kafka_http_url: https://abcdabcdabcdabcd.svc07.us-south.eventstreams.cloud.ibm.com password: abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh user: tokenPrendi nota dei valori per
user,passwordekafka-brokers_saslper la chiave del servizio. Hai bisogno di queste informazioni quando configuri la tua sottoscrizione Code Engine Kafka. I valori perpasswordeapikeysono gli stessi nella chiave del servizio per la tua istanza del servizio Event Streams. Puoi anche utilizzare il comandoibmcloud resource service-key myeventstream-keyper recuperare le informazioni sulla chiave di servizio. -
Inizializza il plug-in Event Streams relativo all'istanza del servizio Event Streams.
ibmcloud es init --instance-name myeventstream -
Crea un argomento Event Streams.
ibmcloud es topic-create kafka-topic1
Configurazione di un'applicazione di esempio Code Engine per produrre messaggi Kafka
Per questa esercitazione, configura un'applicazione Code Engine che funga da produttore di evento dei messaggi Kafka. Lo scopo di questa applicazione kafka-sender-app è connettersi alla tua istanza Event Streams e produrre (inviare)
messaggi Kafka a un destinatario dei messaggi (consumerKafka ). Questa applicazione che produce gli eventi per i messaggi Kafka utilizza Code Engine Kafka sender sample app per inviare i messaggi Kafka. Questa immagine mittente di esempio richiede la variabile di ambiente BROKERS e un segreto che include le credenziali password.
-
Crea un segreto con le credenziali richieste dagli esempi Code Engine Kafka. Ad esempio, crea il segreto
kafka-subscription-secret, per contenere le credenziali richieste sia per l'applicazione di esempio del mittente Kafka che per la sottoscrizione evento Kafka, che utilizza l'esempio del destinatario Kafka. Queste credenziali sono richieste per la sottoscrizione evento Kafka di esempio e la sottoscrizione evento Code Engine Kafka per comunicare con l'istanza del servizio per Event Streams. Anche se non è necessario creare questo segreto prima di creare l'applicazione mittente Kafka e la sottoscrizione evento, questa azione semplifica i passi richiesti.Per creare il segreto
kafka-subscription-secret, aggiungi una variabile di ambiente letterale perpasswordeusername. Per ulteriori informazioni, vedi Crea un segreto con la CLI.- Specifica la chiave
usernamecon il valore diuserelencato nei dettagli delle credenziali del servizio nell'istanza del servizio Event Streams. Per l'istanza del servizio Event Streams, questo valore ètoken. Questa chiave è obbligatoria per l'autenticazione tra la sottoscrizione evento Kafka Code Engine e il broker dei messaggi Kafka. - Specifica la chiave
passwordcon il valore diapikeyelencato nei dettagli delle credenziali del servizio nell'istanza del servizio Event Streams. Questa chiave è richiesta per l'esempio del mittente e per consentire le comunicazioni tra la sottoscrizione evento Code Engine Kafka e il broker dei messaggi Kafka.
ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=<value_of_apikey> --from-literal username=<value_of_user> ``` Ad esempio, ```txt {: pre} ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh --from-literal username=token ``` - Specifica la chiave
-
Creare
kafka-sender-appcon le seguenti informazioni.- Specifica l'opzione
--imageper fare riferimento all'immagine del containericr.io/codeengine/kafka-sender. Questa immagine viene creata dasender.go, che è disponibile dal repository Esempi per IBM Cloud Code Engine GitHub. Questa applicazione mittente di esempio richiede le credenzialipasswordmemorizzate nel tuokafka-subscription-secrete richiede la variabile di ambienteBROKERS. - Specificare l'opzione
--env-from-secretper fare riferimento al segreto completo,kafka-subscription-secret, che contiene le credenzialipassword. - Specifica l'opzione
--envper aggiungere una variabile di ambiente letterale,BROKERS, e fornisci il nome di uno degli host dei broker elencati nei dettagli delle credenziali del servizio nell'istanza del servizio Event Streams. Tuttavia, se si desidera specificare più di un nome host del broker, utilizzare il formato--env BROKERS-broker1,broker2,broker3. - (Facoltativo) Specifica l'opzione
--min-scale=1in modo che l'applicazione abbia sempre un'istanza in esecuzione e non venga scalata a zero. La configurazione dell'applicazione per avere sempre un'istanza in esecuzione è utile quando visualizzi i log. Se sei in esecuzione in un ambiente di produzione, considera il costo di mantenere un'istanza in esecuzione della tua applicazione o se vuoi che Code Engine venga ridimensionato automaticamente a zero. Per impostazione predefinita, l'app viene ridimensionata a zero quando non è in uso.
ibmcloud ce app create --name kafka-sender-app --image icr.io/codeengine/kafka-sender --env-from-secret kafka-subscription-secret --env BROKERS=broker-4-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --min-scale 1 ``` - Specifica l'opzione
-
Dopo che hai distribuito questa applicazione, esegui il comando
app getper confermare che l'applicazione si trova nello statoready.ibmcloud ce app get -n kafka-sender-app
Hai creato l'applicazione kafka-sender-app per produrre i messaggi Kafka per le sottoscrizioni evento Code Engine e hai creato il segreto kafka-subscription-secret che contiene le credenziali richieste.
Configurazione di una sottoscrizione Kafka Code Engine
Affinché Code Engine funzioni con gli eventi Kafka, è necessario configurare un abbonamento agli eventi Code Engine Kafka per connettersi ai broker di eventi Kafka e ascoltare gli eventi Kafka. Inoltre, configura un'app Code Engine affinché funga da destinataria degli eventi Kafka. L'abbonamento agli eventi " Kafka " definisce la relazione tra il produttore (mittente) Kafka e il consumatore (destinatario) degli eventi.
L'abbonamento all'evento " Code Engine " ( Kafka ) si collega al broker di messaggi Kafka e invia richieste POST all' HTTP per ogni messaggio in entrata proveniente da Kafka all'applicazione ricevente. Per ulteriori informazioni sui dati inclusi negli eventi " Kafka ", consultare le intestazioni " HTTP " e le informazioni del corpo relative agli eventi inviati alle app.
-
Crea un'applicazione Code Engine per agire come consumatore di eventi dei messaggi Kafka e ricevere gli eventi Kafka. Ad esempio, crea un'applicazione denominata
kafka-receiver-appche utilizza l'immagineicr.io/codeengine/kafka-receiver. Questa immagine viene creata dareceiver.go, che è disponibile dal repository Esempi per IBM Cloud Code Engine GitHub. Questo esempio non richiede alcuna variabile di ambiente. Facoltativamente, puoi specificare l'opzione--min-scale=1, in modo che l'app abbia sempre un'istanza in esecuzione e non venga ridimensionata a zero. La configurazione dell'applicazione per avere sempre un'istanza in esecuzione è utile quando visualizzi i log. Se sei in esecuzione in un ambiente di produzione, considera il costo di mantenere un'istanza in esecuzione della tua applicazione o se vuoi che Code Engine venga ridimensionato automaticamente a zero. Per impostazione predefinita, l'app viene ridimensionata a zero quando non è in uso.ibmcloud ce app create -n kafka-receiver-app --image icr.io/codeengine/kafka-receiver --min-scale 1Per impostazione predefinita, gli eventi vengono indirizzati alla pagina principale URL dell'applicazione di destinazione. Puoi inviare eventi a una destinazione differente all'interno dell'applicazione utilizzando l'opzione
--path. Ad esempio, se la tua sottoscrizione specifica--path /event, l'evento viene inviato ahttps://<base application URL>/events. -
Dopo che hai distribuito questa applicazione, esegui il comando
app getper confermare che l'applicazione si trova nello statoready.ibmcloud ce app get -n kafka-receiver-app -
Crea una sottoscrizione evento Kafka Code Engine per i tuoi eventi Kafka utilizzando il comando
ibmcloud ce sub kafka create. Utilizzare il segretokafka-subscription-secretprecedentemente creato per accedere al broker dei messaggi. Specifica le informazioni del broker in base alle informazioni delle credenziali del servizio per la tua risorsa Kafka. Per questo esempio, è possibile ottenere le informazioni del broker dall'output del comandoibmcloud resource service-key myeventstream-key. Notare che è necessario specificare un'opzione--brokerper ciascun broker per il proprio argomento. L'opzione--destinationspecifica la risorsa Code Engine che riceve gli eventi.ibmcloud ce sub kafka create --name mykafkasubscription --destination kafka-receiver-app --secret kafka-subscription-secret --topic kafka-topic1 --broker broker-3-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --broker broker-5-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --broker broker-0-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --broker broker-1-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --broker broker-4-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 --broker broker-2-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 -
Visualizzare i dettagli della sottoscrizione evento Kafka.
ibmcloud ce sub kafka get -n mykafkasubscriptionOutput di esempio
Getting Kafka event subscription 'mykafkasubscription'... OK Name: mykafkasubscription [...] Destination Type: app Destination: kafka-receiver-app Brokers: broker-3-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-5-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-0-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-1-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-4-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 broker-2-abcdabcdabcdabcd.kafka.svc07.us-south.eventstreams.cloud.ibm.com:9093 Consumer Group: knative-kafka-source-a4072fe1-1dfa-4470-9d07-bf7a0ff8e340 Topics: kafka-topic1 Secret key reference (user): kafka-subscription-secret.username Secret key reference (password): kafka-subscription-secret.password Ready: true Conditions: Type OK Age Reason ConnectionEstablished true 24s InitialOffsetsCommitted true 24s Ready true 24s Scheduled true 24s SinkProvided true 24s Events: Type Reason Age Source Messages Normal FinalizerUpdate 26s kafkasource-controller Updated "mykafkasubscription" finalizers
Verifica della sottoscrizione
Ora che è stato creato l'abbonamento all'evento Kafka, che fa riferimento all'applicazione kafka-receiver-app, utilizza l' kafka-sender-app per inviare eventi di messaggio all'applicazione ricevente.
-
Ottenere l' URL pubblico dell'app di destinazione,
kafka-sender-app, utilizzando ilibmcloud ce app getURL comando con l'opzione--output urlper individuare l' della propria app.ibmcloud ce app get -n kafka-sender-app --output urlOutput di esempio
https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud -
Esegui l'applicazione del produttore eventi Kafka
kafka-sender-appper inviare gli eventi all'applicazione Code Engine di destinazione. Richiamare l'applicazionekafka-sender-appconcurle specificare i valori per l'argomento e il numero di messaggi. Utilizza l'output delibmcloud ce app getper individuare l' URL e pubblico della tua app. Assicurati di racchiudere il valore tra virgolette per assicurarti che sia trattato come una singola stringa. Ad esempio,curl "<public_URL_of_Kafka_sender_app>?topic=<your_topic_name>&num=<number_of_messages_to_produce>"Ad esempio,
curl "https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud?topic=kafka-topic1&num=1" -
Visualizzare gli eventi nei log. Quando la tua sottoscrizione evento Kafka viene creata con un broker, argomenti e un segreto di accesso validi e hai un'applicazione Kafka che produce messaggi su tale argomento (come
kafka-sender-app), puoi visualizzare gli eventi nei log per la tua applicazione Code Engine di destinazione che riceve i messaggi Kafka, comekafka-receiver-app. Quando utilizzi l'applicazione ricevente Kafka (icr.io/codeengine/kafka-receiver), cercaEvent datanei log per l'applicazione ricevente per vedere i messaggi ricevuti.ibmcloud ce app logs -n kafka-receiver-appOutput di esempio
Getting logs for all instances of application 'kafka-receiver-app'... OK kafka-receiver-app-00001-deployment-66976f7988-9xttm/user-container: 2022/03/31 22:19:45 Listening on port 8080 2022/03/31 22:19:46 ---------- 2022/03/31 22:19:46 Path: / 2022/03/31 22:19:46 Header: Accept-Encoding=[gzip] 2022/03/31 22:19:46 Header: Ce-Id=[partition:0/offset:167] 2022/03/31 22:19:46 Header: Ce-Source=[/apis/v1/namespaces/glxo4k7nj7d/kafkasources/mykafkasubscription#kafka-topic1] 2022/03/31 22:19:46 Header: Ce-Specversion=[1.0] 2022/03/31 22:19:46 Header: Ce-Subject=[partition:0#167] 2022/03/31 22:19:46 Header: Ce-Time=[2022-03-31T22:19:36.499Z] 2022/03/31 22:19:46 Header: Ce-Type=[dev.knative.kafka.event] 2022/03/31 22:19:46 Header: Content-Length=[8] 2022/03/31 22:19:46 Header: Forwarded=[for=172.30.208.213;proto=http, for=127.0.0.6] 2022/03/31 22:19:46 Header: K-Proxy-Request=[activator] 2022/03/31 22:19:46 Header: Traceparent=[00-b033708685c715a7c2384cdf05797785-65540b0937e9b0ce-00] 2022/03/31 22:19:46 Header: User-Agent=[Go-http-client/1.1] 2022/03/31 22:19:46 Header: X-B3-Parentspanid=[e1a785d7fdbead6c] 2022/03/31 22:19:46 Header: X-B3-Sampled=[1] 2022/03/31 22:19:46 Header: X-B3-Spanid=[abcde9901e6bf83f] 2022/03/31 22:19:46 Header: X-B3-Traceid=[abcde490a426573772fa0bf60caf5ddb] 2022/03/31 22:19:46 Header: X-Envoy-Attempt-Count=[1] 2022/03/31 22:19:46 Header: X-Forwarded-For=[172.30.208.213, 127.0.0.6, 127.0.0.6] 2022/03/31 22:19:46 Header: X-Forwarded-Proto=[http] 2022/03/31 22:19:46 Header: X-Request-Id=[abcdeb4e-c5ac-abcd-abcd-60e6278abcde] 2022/03/31 22:19:46 Event data: test1: 1Nota che le informazioni di log per le app durano solo un'ora. Per ulteriori informazioni sulla visualizzazione dei log per le applicazioni (o i lavori), vedi Visualizzazione dei log.
Aggiornamento della sottoscrizione
Per aggiornare una sottoscrizione evento con la CLI, utilizza il comando ibmcloud ce subscription kafka update. Il seguente esempio
aggiorna il nome dell'argomento.
ibmcloud ce sub kafka update -n mykafkasubscription --topic kafka-topic2
È possibile utilizzare il ibmcloud ce subscription kafka update per aggiornare i valori relativi all'abbonamento Kafka. Tuttavia,
non è possibile modificare il valore per il gruppo di consumatori con questo comando. Se desideri aggiornare la sottoscrizione per farvi riferimento a un argomento diverso, assicurati che l'argomento Kafka esista prima di aggiornare la sottoscrizione.
Ripulisci per l'esercitazione di sottoscrizione Kafka
Sei pronto a eliminare la tua sottoscrizione Kafka, le applicazioni di invio e ricezione e il segreto? È possibile utilizzare i comandi ibmcloud ce app delete,
ibmcloud ce sub kafka delete e ibmcloud ce sub kafka delete.
Facoltativamente, è possibile utilizzare l'opzione -f per forzare l'eliminazione del componente senza conferma.
Quando si elimina l'abbonamento " Kafka ", l'eliminazione non comporta la rimozione dell'app a cui fa riferimento l'abbonamento.
Per rimuovere la sottoscrizione,
ibmcloud ce sub kafka delete --name mykafkasubscription -f
Per rimuovere la tua applicazione di ricezione messaggi Kafka,
ibmcloud ce app delete --name kafka-receiver-app -f
Allo stesso modo, è possibile rimuovere kafka-sender-app.
ibmcloud ce app delete --name kafka-sender-app -f
Per rimuovere kafka-subscription-secret,
ibmcloud ce secret delete --name kafka-subscription-secret -f
Sei pronto a eliminare la tua istanza del servizio per l'istanza del servizio Event Streams ? L'opzione --recursive specifica di rimuovere tutte le risorse per l'istanza del servizio, che include la chiave del servizio associata.
ibmcloud resource service-instance-delete myeventstream --recursive -f
Passi successivi
Per ulteriori informazioni sull'utilizzo delle sottoscrizioni evento Kafka, vedi Utilizzo del produttore evento Kafka.
Cerchi altri esempi di codice? Dai un'occhiata agli esempi disponibili nel repository " IBM Cloud Code Engine " su GitHub.