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

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.

  1. 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 denominata myeventstream.

    ibmcloud resource service-instance-create myeventstream messagehub lite us-south
    
  2. Crea una chiave del servizio per fornire le credenziali alla tua istanza del servizio.

    ibmcloud resource service-key-create myeventstream-key Manager --instance-name myeventstream
    

    Output 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:                     token
    

    Prendi nota dei valori per user, password e kafka-brokers_sasl per la chiave del servizio. Hai bisogno di queste informazioni quando configuri la tua sottoscrizione Code Engine Kafka. I valori per password e apikey sono gli stessi nella chiave del servizio per la tua istanza del servizio Event Streams. Puoi anche utilizzare il comando ibmcloud resource service-key myeventstream-key per recuperare le informazioni sulla chiave di servizio.

  3. Inizializza il plug-in Event Streams relativo all'istanza del servizio Event Streams.

    ibmcloud es init --instance-name myeventstream
    
  4. 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.

  1. 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 per password e username. Per ulteriori informazioni, vedi Crea un segreto con la CLI.

    • Specifica la chiave username con il valore di user elencato 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 password con il valore di apikey elencato 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
        ```
    
  2. Creare kafka-sender-app con le seguenti informazioni.

    • Specifica l'opzione --image per fare riferimento all'immagine del container icr.io/codeengine/kafka-sender. Questa immagine viene creata da sender.go, che è disponibile dal repository Esempi per IBM Cloud Code Engine GitHub. Questa applicazione mittente di esempio richiede le credenziali password memorizzate nel tuo kafka-subscription-secret e richiede la variabile di ambiente BROKERS.
    • Specificare l'opzione --env-from-secret per fare riferimento al segreto completo, kafka-subscription-secret, che contiene le credenziali password.
    • Specifica l'opzione --env per 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=1 in 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
        ```
    
  3. Dopo che hai distribuito questa applicazione, esegui il comando app get per confermare che l'applicazione si trova nello stato ready.

    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.

  1. 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-app che utilizza l'immagine icr.io/codeengine/kafka-receiver. Questa immagine viene creata da receiver.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 1
    

    Per 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 a https://<base application URL>/events.

  2. Dopo che hai distribuito questa applicazione, esegui il comando app get per confermare che l'applicazione si trova nello stato ready.

    ibmcloud ce app get -n kafka-receiver-app
    
  3. Crea una sottoscrizione evento Kafka Code Engine per i tuoi eventi Kafka utilizzando il comando ibmcloud ce sub kafka create. Utilizzare il segreto kafka-subscription-secret precedentemente 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 comando ibmcloud resource service-key myeventstream-key. Notare che è necessario specificare un'opzione --broker per ciascun broker per il proprio argomento. L'opzione --destination specifica 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
    
  4. Visualizzare i dettagli della sottoscrizione evento Kafka.

    ibmcloud ce sub kafka get -n mykafkasubscription
    

    Output 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.

  1. Ottenere l' URL pubblico dell'app di destinazione, kafka-sender-app, utilizzando il ibmcloud ce app getURL comando con l'opzione --output url per individuare l' della propria app.

    ibmcloud ce app get -n kafka-sender-app --output url
    

    Output di esempio

    https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud
    
  2. Esegui l'applicazione del produttore eventi Kafka kafka-sender-app per inviare gli eventi all'applicazione Code Engine di destinazione. Richiamare l'applicazione kafka-sender-app con curl e specificare i valori per l'argomento e il numero di messaggi. Utilizza l'output del ibmcloud ce app get per 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"
    
  3. 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, come kafka-receiver-app. Quando utilizzi l'applicazione ricevente Kafka (icr.io/codeengine/kafka-receiver), cerca Event data nei log per l'applicazione ricevente per vedere i messaggi ricevuti.

    ibmcloud ce app logs -n kafka-receiver-app
    

    Output 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: 1
    

    Nota 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.