Assinatura de eventos Kafka
Com este tutorial, você aprenderá a assinar eventos Kafka usando a IBM Cloud® Code Engine CLI.
Muitas vezes, em ambientes distribuídos, você deseja que os seus aplicativos ou tarefas reajam a mensagens (eventos) que são geradas por meio de outros componentes, que geralmente são chamados de produtores de evento. Com o Code Engine, seus aplicativos ou tarefas podem receber eventos de interesse assinando os produtores de evento. As informações do evento são recebidas como solicitações de HTTP POST para aplicativos e como variáveis de ambiente para tarefas.
O produtor de eventos Kafka assiste a novas mensagens para aparecer em uma instância Kafka. Quando você cria uma assinatura Code Engine Kafka para um conjunto de tópicos, seu app ou job recebe um evento separado para cada nova mensagem que aparece em um dos tópicos.
Enquanto você pode usar qualquer instância Kafka, os exemplos neste tutorial usam o serviço IBM® Event Streams for IBM Cloud®. Event Streams é um serviço de streaming de eventos IBM para eventos Kafka. Para obter mais informações sobre este serviço, consulte Event Streams documentação.
Antes de Iniciar
- Configure o seu ambiente da CLI do Code Engine.
- Configure seu Event Streams CLI.
- Criar e trabalhar com um projeto.
Todos os usuários do Code Engine são obrigados a ter uma conta pré-paga. Os tutoriais podem gerar custos adicionais. Use o Estimador de custos para gerar uma estimativa de custo com base em seu uso planejado. Para obter mais informações, consulte Code Engine precificação.
Configuração do produtor de eventos Kafka
Você pode configurar o seu produtor de mensagens Kafka para enviar mensagens para Code Engine Kafka. Use sua assinatura de eventos Code Engine Kafka para acionar aplicativos ou jobs quando uma mensagem Kafka for recebida.
Para começar, crie uma instância de serviço Event Streams para o seu serviço de streaming de eventos. Enquanto você pode usar o console ou a CLI, as etapas a seguir descrevem como configurar o produtor de eventos Event Streams com o CLI.
-
Crie uma instância de serviço para Event Streams. O nome do serviço CLI Event Streams é
messagehub. Para este exemplo, crie uma instância de serviço Event Streams que é denominadamyeventstream.ibmcloud resource service-instance-create myeventstream messagehub lite us-south -
Crie uma chave de serviço para fornecer credenciais à sua instância de serviço.
ibmcloud resource service-key-create myeventstream-key Manager --instance-name myeventstreamSaída de exemplo
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: tokenAnote os valores para
user,passwordekafka-brokers_saslpara a sua chave de serviço. Você precisa desta informação quando configurar sua assinatura Code Engine Kafka. Os valores parapasswordeapikeysão os mesmos na chave de serviço para a sua instância de serviço Event Streams. Você também pode usar o comandoibmcloud resource service-key myeventstream-keypara recuperar as informações da chave de serviço. -
Inicialize o plug-in Event Streams em relação à sua instância de serviço Event Streams.
ibmcloud es init --instance-name myeventstream -
Crie um tópico Event Streams.
ibmcloud es topic-create kafka-topic1
Configuração de um app de amostra Code Engine para produzir mensagens Kafka
Para este tutorial, configure um aplicativo Code Engine para atuar como um produtor de eventos de mensagens Kafka. O objetivo deste app kafka-sender-app é conectar-se à sua instância Event Streams e produzir (enviar) mensagens Kafka
para um receptor das mensagens (consumidorKafka ). Este app que produz eventos para mensagens Kafka usa o Code Engine Kafka sender sample app para enviar mensagens Kafka. Esta imagem de remetente de amostra requer a variável de ambiente BROKERS e um segredo que inclui as credenciais password.
-
Crie um segredo com credenciais que são necessárias pelas amostras Code Engine Kafka. Por exemplo, crie o segredo
kafka-subscription-secret, para conter as credenciais necessárias tanto para o app de amostra do remetente Kafka quanto para a assinatura de eventos Kafka, que usa a amostra do receptor Kafka. Essas credenciais são necessárias para a amostra do app do emissor Kafka e para a assinatura de eventos Code Engine Kafka para se comunicar com a instância de serviço para Event Streams. Enquanto não é necessário que você crie este segredo antes de criar o app do remetente Kafka e a assinatura do evento, esta ação simplifica as etapas necessárias.Para criar o segredo
kafka-subscription-secret, inclua uma variável de ambiente literal parapassword, eusername. Para obter mais informações, consulte crie um segredo com a CLI.-
Especifique a chave
usernamecom o valor deuserque está listado nos detalhes das credenciais de serviço na instância de serviço Event Streams. Para a instância de serviço Event Streams, este valor étoken. Esta chave é necessária para autenticação entre a assinatura de eventos Code Engine Kafka e o intermediário de mensagens Kafka. -
Especifique a chave
passwordcom o valor deapikeyque está listado nos detalhes das credenciais de serviço na instância de serviço Event Streams. Esta chave é necessária para a amostra do remetente, e para ativar as comunicações entre a assinatura de eventos Code Engine Kafka e o intermediário de mensagens Kafka.ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=<value_of_apikey> --from-literal username=<value_of_user>Por exemplo,
ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh --from-literal username=token
-
-
Crie o
kafka-sender-appcom as seguintes informações.-
Especifique a opção
--imagepara referencia a imagem do contêinericr.io/codeengine/kafka-sender. Essa imagem é construída a partir dosender.go, que está disponível a partir do Amostras para IBM Cloud Code Engine GitHub repo. Este app de remetente de amostra requer as credenciaispasswordque são armazenadas em seukafka-subscription-secret, e ele requer a variável de ambienteBROKERS. -
Especifique a opção
--env-from-secretpara referenciar o segredo completo,kafka-subscription-secret, que contém as credenciaispassword. -
Especifique a opção
--envpara adicionar uma variável de ambiente literal,BROKERS, e forneça o nome de um dos hosts dos intermediários listados nos detalhes das credenciais de serviço na instância de serviço Event Streams. No entanto, se você quiser especificar mais de um hostname do intermediário, use o formato--env BROKERS-broker1,broker2,broker3. -
(opcional) Especifique a opção
--min-scale=1para que o aplicativo sempre tenha uma instância em execução e não seja dimensionado para zero. Configurar o app para sempre ter uma instância em execução é útil quando você visualiza logs. Se você estiver em execução em um ambiente de produção, considere o custo de manter uma instância em execução de seu app ou se deseja Code Engine para autoscale a zero. Por padrão, o app escala para zero quando não em 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
-
-
Depois de implementar este app, execute o comando
app getpara confirmar se o app está emreadystatus.ibmcloud ce app get -n kafka-sender-app
Você criou o app kafka-sender-app para produzir mensagens Kafka para as assinaturas de eventos Code Engine, e você criou o segredo kafka-subscription-secret que contém as credenciais necessárias.
Configuração de uma assinatura Code Engine Kafka
Para Code Engine para trabalhar com eventos Kafka, configure uma assinatura de eventos Code Engine Kafka para conectar-se a Kafka intermediários de eventos e ouvir eventos Kafka. Além disso, configure um app Code Engine para agir como o receptor dos eventos Kafka. A assinatura de eventos Kafka define a relação entre o produtor Kafka (emissor) e o consumidor (receptor) de eventos.
A assinatura de eventos Code Engine Kafka conecta-se ao seu intermediário de mensagens Kafka e envia pedidos de HTTP Post para cada mensagem de entrada Kafka para o aplicativo receptor. Para obter mais informações sobre as informações que estão incluídas com os eventos Kafka, consulte cabeçalhos HTTP e informações do corpo para eventos que são entregues a apps.
-
Crie um aplicativo Code Engine para agir como um consumidor de eventos de mensagens Kafka e receber os eventos Kafka. Por exemplo, crie um aplicativo que seja chamado
kafka-receiver-appe que use a imagemicr.io/codeengine/kafka-receiver. Essa imagem é construída a partir doreceiver.go, que está disponível a partir do Amostras para IBM Cloud Code Engine GitHub repo. Esta amostra não requer nenhuma variável de ambiente. Opcionalmente, você pode especificar a opção--min-scale=1, de modo que o aplicativo sempre tenha uma instância em execução e não seja dimensionado para zero. Configurar o app para sempre ter uma instância em execução é útil quando você visualiza logs. Se você estiver em execução em um ambiente de produção, considere o custo de manter uma instância em execução de seu app ou se deseja Code Engine para autoscale a zero. Por padrão, o app escala para zero quando não em uso.ibmcloud ce app create -n kafka-receiver-app --image icr.io/codeengine/kafka-receiver --min-scale 1Por padrão, os eventos são encaminhados para a URL raiz do aplicativo de destino. É possível enviar eventos para um destino diferente dentro do app, usando a opção
--path. Por exemplo, se a sua assinatura especificar--path /event, o evento será enviado parahttps://<base application URL>/events. -
Depois de implementar este app, execute o comando
app getpara confirmar se o app está emreadystatus.ibmcloud ce app get -n kafka-receiver-app -
Crie uma assinatura de eventos Code Engine Kafka para os seus eventos Kafka usando o comando
ibmcloud ce sub kafka create. Use o segredokafka-subscription-secretque você criou anteriormente para acessar o intermediário de mensagens. Especifique as informações do intermediário com base nas informações de credenciais de serviço para o seu recurso Kafka. Para este exemplo, é possível obter as informações do intermediário a partir da saída do comandoibmcloud resource service-key myeventstream-key. Observe que você deve especificar uma opção--brokerpara cada intermediário para o seu tópico. A opção--destinationespecifica o recurso Code Engine que recebe os eventos.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 -
Exibir os detalhes da assinatura do evento Kafka.
ibmcloud ce sub kafka get -n mykafkasubscriptionSaída de exemplo
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
Testando a sua assinatura
Agora que a sua assinatura de eventos Kafka, que faz referência ao aplicativo kafka-receiver-app, é criada, use o kafka-sender-app para enviar eventos de mensagem para o aplicativo receptor.
-
Obtenha a URL pública do app de destino,
kafka-sender-appusando o comandoibmcloud ce app getcom a opção--output urlpara encontrar a URL do seu app.ibmcloud ce app get -n kafka-sender-app --output urlSaída de exemplo
https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud -
Execute o aplicativo de produtor de eventos Kafka,
kafka-sender-apppara enviar eventos para o aplicativo Code Engine. Ligue para o aplicativokafka-sender-appcomcurle especifique valores para o tópico e o número de mensagens. Use a saída do comandoibmcloud ce app getpara encontrar a URL pública do seu aplicativo. Certifique-se de agrupar o valor para curl entre aspas para garantir que ele seja tratado como uma única string. Por exemplo,curl "<public_URL_of_Kafka_sender_app>?topic=<your_topic_name>&num=<number_of_messages_to_produce>"Por exemplo,
curl "https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud?topic=kafka-topic1&num=1" -
Visualizar eventos em logs. Quando a sua assinatura de eventos Kafka é criada com um intermediário, tópicos e um segredo de acesso que são válidos, e você tem um aplicativo Kafka que produz mensagens naquele tópico (como
kafka-sender-app), então você pode ver eventos em logs para o seu destino Code Engine aplicativo que recebe mensagens Kafka, comokafka-receiver-app. Ao utilizar o app do receptor Kafka (icr.io/codeengine/kafka-receiver), procure porEvent datanos logs para o aplicativo receptor ver as mensagens que são recebidas.ibmcloud ce app logs -n kafka-receiver-appSaída de exemplo
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: 1Observe que as informações de registro dos aplicativos duram apenas uma hora. Para obter mais informações sobre visualização de logs para apps (ou jobs), consulte Visualizações de logs.
Atualizando sua assinatura
Para atualizar uma assinatura de evento com a CLI, use o comando ibmcloud ce subscription kafka update. O exemplo a seguir atualiza
o nome do tópico.
ibmcloud ce sub kafka update -n mykafkasubscription --topic kafka-topic2
Você pode usar o comando ibmcloud ce subscription kafka update para atualizar os valores para a assinatura Kafka. No entanto, não
é possível modificar o valor para o grupo de consumidores com este comando. Se você deseja atualizar a assinatura para referencia um tópico diferente, certise-se de que o tópico Kafka existe antes de atualizar a assinatura.
Tutorial de limpeza para assinatura Kafka
Pronto para excluir sua assinatura Kafka, o envio e recebimento de apps, e o segredo? Você pode usar os comandos ibmcloud ce app delete,
o ibmcloud ce sub kafka delete e os comandos ibmcloud ce sub kafka delete.
Opcionalmente, você pode usar a opção -f para forçar a exclusão do componente sem confirmação.
Quando você exclui a assinatura Kafka, o delete não exclui o app que é referenciado pela assinatura.
Para remover a sua assinatura,
ibmcloud ce sub kafka delete --name mykafkasubscription -f
Para remover o seu aplicativo de recebimento de mensagens Kafka,
ibmcloud ce app delete --name kafka-receiver-app -f
Da mesma forma, é possível remover o kafka-sender-app.
ibmcloud ce app delete --name kafka-sender-app -f
Para remover o kafka-subscription-secret,
ibmcloud ce secret delete --name kafka-subscription-secret -f
Pronto para excluir a sua instância de serviço para a instância de serviço Event Streams ? A opção --recursive especifica para remover todos os recursos para a instância de serviço, o que inclui a chave de serviço associada.
ibmcloud resource service-instance-delete myeventstream --recursive -f
Próximas etapas
Para obter mais informações sobre como trabalhar com inscrições de eventos Kafka, consulte Trabalhando com o produtor de eventos Kafka.
Procurando mais exemplos de código? Confira as Amostras para IBM Cloud Code Engine GitHub repo.