Kafka 이벤트 구독하기
Kafka 이 튜토리얼을 통해 IBM Cloud® Code Engine CLI를 사용하여 이벤트에 구독하는 방법을 배울 수 있습니다.
분산 환경에서는 다른 컴포넌트(일반적으로 이벤트 생성자라고 함)에서 생성된 메시지(이벤트)에 애플리케이션 또는 작업이 반응하도록 하려는 경우가 많습니다. Code Engine에서는 애플리케이션 또는 작업이 이벤트 생성자를 구독하여 관심있는 이벤트를 수신할 수 있습니다. 이벤트 정보는 애플리케이션의 경우 POST HTTP 요청으로서, 작업의 경우 환경 변수로서 수신합니다.
Kafka 이벤트 프로듀서는 Kafka 인스턴스에 새 메시지가 표시되는지 감시합니다. Code Engine 만들 때 주제 집합에 대한 Kafka 구독을 만들면 앱 또는 작업은 주제 중 하나에 나타나는 각 새 메시지에 대해 별도의 이벤트를 수신합니다.
Kafka 의 어떤 인스턴스든 사용할 수 있지만, 이 튜토리얼의 예제에서는 IBM® Event Streams for IBM Cloud® 서비스를 사용합니다. Event Streams 는 Kafka 이벤트를 위한 IBM 이벤트 스트리밍 서비스입니다. 이 서비스에 대한 자세한 내용은 Event Streams 문서를 참조하십시오.
시작하기 전에
모든 Code Engine 사용자에게는 종량과금제 계정이 있어야 합니다. 튜토리얼은 비용이 부과될 수 있습니다. 비용 추정기를 사용하여 예상 사용량을 기반으로 한 비용 추정을 생성하십시오. 자세한 정보는 Code Engine 가격을 참조하십시오.
Kafka 이벤트 프로듀서 설정하기
Kafka 메시지 프로듀서를 설정하여 Code Engine Kafka 이벤트 구독으로 메시지를 전송할 수 있습니다. Code Engine Kafka 이벤트 구독을 사용하여 Kafka 메시지가 수신될 때 애플리케이션이나 작업을 트리거할 수 있습니다.
시작하려면 이벤트 스트리밍 서비스에 대한 Event Streams 서비스 인스턴스를 만듭니다. 콘솔 또는 CLI를 사용할 수 있지만, 다음 단계에서는 CLI로 Event Streams 이벤트 프로듀서를 설정하는 방법에 대해 설명합니다.
-
Event Streams 대한 서비스 인스턴스를 만듭니다. Event Streams 이름입니다 CLI 서비스의 이름은
messagehub. 이 예에서는myeventstream이름의 Event Streams 서비스 인스턴스를 만듭니다.ibmcloud resource service-instance-create myeventstream messagehub lite us-south -
서비스 키를 만들어 서비스 인스턴스에 자격 증명을 제공합니다.
ibmcloud resource service-key-create myeventstream-key Manager --instance-name myeventstream출력 예
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서비스 키의
user,password,kafka-brokers_sasl값을 기록해 두세요. Code Engine 설정할 때 이 정보가 필요합니다 Kafka 구독을 설정할 때 필요합니다. Event Streams 서비스 인스턴스의 서비스 키에서 ‘password’와 ‘apikey’의 값은 동일합니다.ibmcloud resource service-key myeventstream-key명령어를 사용하여 서비스 키 정보를 조회할 수도 있습니다. -
Event Streams 서비스 인스턴스에 맞춰 ‘ Event Streams ’ 플러그인을 초기화하십시오.
ibmcloud es init --instance-name myeventstream -
Event Streams 주제를 생성합니다.
ibmcloud es topic-create kafka-topic1
Code Engine 샘플 앱을 설정하여 Kafka 메시지 생성하기
이 튜토리얼에서는 Code Engine 애플리케이션을 설정하여 Kafka 메시지의 이벤트 프로듀서 역할을 하도록 합니다. 이 kafka-sender-app 앱의 목적은 Event Streams 인스턴스에 연결하여 메시지 수신자Kafka 소비자)에게 Kafka 메시지를 생성(전송)하는 것입니다. Kafka 메시지를 위한 이벤트를 생성하는 이 앱은 Code Engine Kafka 의 발신자 샘플 앱을 사용하여 Kafka 메시지를 전송합니다. 이 샘플 발신자 이미지에는 BROKERS 환경 변수와 password 자격 증명이 포함된 비밀 번호가 필요합니다.
-
Code Engine 필요한 자격 증명을 사용하여 비밀번호를 만듭니다 Kafka 샘플. 예를 들어,
kafka-subscription-secret생성하여 Kafka 발신자 샘플 앱과 Kafka 수신자 샘플을 사용하는 Kafka 이벤트 구독에 모두 필요한 자격 증명을 포함합니다. 이러한 자격 증명은 샘플 Kafka 발신자 앱과 Code Engine 필요합니다 Event Streams 대한 서비스 인스턴스와 통신하기 위한 Kafka 이벤트 구독에 필요합니다. Kafka 발신자 앱과 이벤트 구독을 만들기 전에 이 비밀번호를 만들 필요는 없지만, 이 작업을 수행하면 필요한 단계가 간소화됩니다.kafka-subscription-secret시크릿을 생성하려면password및username에 대한 리터럴 환경 변수를 추가하십시오. 자세한 내용은 CLI로 비밀번호 만들기를 참조하세요.- Event Streams 서비스 인스턴스의 서비스 자격 증명 세부 정보에 나열된
username값의user키를 지정합니다. Event Streams 서비스 인스턴스의 경우 이 값은token. 이 키는 Code Engine 간의 인증에 필요합니다 Kafka 이벤트 구독과 Kafka 메시지 브로커 간의 인증에 필요합니다. - Event Streams 서비스 인스턴스의 서비스 자격 증명 세부 정보에 나열된
password값의apikey키를 지정합니다. 이 키는 발신자 샘플에 필요하며 Code Engine 간의 통신을 활성화하는 데 필요합니다 Kafka 이벤트 구독과 Kafka 메시지 브로커 간의 통신을 활성화하는 데 필요합니다.
ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=<value_of_apikey> --from-literal username=<value_of_user> ``` 예를 들면 다음과 같습니다. ```txt {: pre} ibmcloud ce secret create --name kafka-subscription-secret --from-literal password=abcdeH9tu3qE5Sn8VbJfcDEWtjR_l0iPisB3abcdefgh --from-literal username=token ``` - Event Streams 서비스 인스턴스의 서비스 자격 증명 세부 정보에 나열된
-
다음 정보로
kafka-sender-app생성합니다.--image옵션을 지정하여icr.io/codeengine/kafka-sender컨테이너 이미지를 참조하십시오. 이 이미지는sender.go빌드한 것으로 IBM Cloud Code Engine GitHub 리포지토리에 대한 샘플 사용할 수 있습니다. 이 샘플 발신자 앱에는kafka-subscription-secret저장된password자격 증명이 필요하며BROKERS환경 변수가 필요합니다.--env-from-secret옵션을 지정하여password자격 증명이 포함된 전체 시크릿(kafka-subscription-secret)을 참조하십시오.- 리터럴 환경 변수인
BROKERS추가하려면--env옵션을 지정하고 Event Streams 서비스 인스턴스의 서비스 자격 증명 세부 정보에 나열된 브로커 호스트 중 하나의 이름을 입력합니다. 그러나 브로커 호스트 이름을 두 개 이상 지정하려면--env BROKERS-broker1,broker2,broker3형식을 사용합니다. - (선택 사항) 앱에 항상 실행 중인 인스턴스가 유지되고 인스턴스 수가 0으로 줄어들지 않도록 하려면
--min-scale=1옵션을 지정하십시오. 항상 실행 중인 인스턴스가 있도록 앱을 구성하면 로그를 볼 때 유용합니다. 프로덕션 환경에서 실행하는 경우 앱의 실행 중인 인스턴스를 유지하는 데 드는 비용 또는 Code Engine 0으로 자동 확장할지 여부를 고려하세요. 기본적으로 앱을 사용하지 않을 때는 앱 크기가 0으로 축소됩니다.
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 ``` -
이 앱을 배포한 후
app get명령을 실행하여 앱이ready상태인지 확인합니다.ibmcloud ce app get -n kafka-sender-app
이벤트 구독에 대한 Code Engine Kafka 메시지를 생성하는 kafka-sender-app 앱을 만들었고, 필요한 자격 증명이 포함된 kafka-subscription-secret 비밀을 만들었습니다.
Code Engine Kafka 구독
Code Engine 가 Kafka 이벤트를 처리하려면, Code Engine Kafka 이벤트 구독을 설정하여 Kafka 이벤트 브로커에 연결하고 Kafka 이벤트를 수신 대기해야 합니다. 또한, Kafka 이벤트의 수신자 역할을 할 Code Engine 앱을 설정하세요. Kafka 이벤트 구독은 Kafka 의 이벤트 프로듀서(발신자)와 컨슈머(수신자) 간의 관계를 정의합니다.
Code Engine ( Kafka ) 이벤트 구독은 사용자의 Kafka 메시지 브로커에 연결되어, 수신되는 각 Kafka 메시지에 대해 HTTP 로 POST 요청을 수신자 애플리케이션으로 전송합니다. Kafka 이벤트에 포함된 정보에 대한 자세한 내용은, 앱으로 전달되는 이벤트의 HTTP 헤더 및 본문 정보를 참조하십시오.
-
Kafka 메시지의 이벤트 소비자 역할을 하고 Kafka 이벤트를 수신하는 Code Engine 애플리케이션을 만듭니다. 예를 들어,
icr.io/codeengine/kafka-receiver이미지를 사용하는kafka-receiver-app이라는 애플리케이션을 작성하십시오. 이 이미지는receiver.go빌드한 것으로 IBM Cloud Code Engine GitHub 리포지토리에 대한 샘플 사용할 수 있습니다. 이 샘플에는 환경 변수가 필요하지 않습니다. 선택적으로--min-scale=1옵션을 지정하면, 앱의 인스턴스가 항상 실행 중이 되도록 하고 인스턴스 수가 0으로 줄어들지 않게 할 수 있습니다. 항상 실행 중인 인스턴스가 있도록 앱을 구성하면 로그를 볼 때 유용합니다. 프로덕션 환경에서 실행하는 경우 앱의 실행 중인 인스턴스를 유지하는 데 드는 비용 또는 Code Engine 0으로 자동 확장할지 여부를 고려하세요. 기본적으로 앱을 사용하지 않을 때는 앱 크기가 0으로 축소됩니다.ibmcloud ce app create -n kafka-receiver-app --image icr.io/codeengine/kafka-receiver --min-scale 1기본적으로 이벤트는 대상 애플리케이션의 루트 URL로 라우팅됩니다.
--path옵션을 사용하여 앱 내의 다른 대상에 이벤트를 전송할 수 있습니다. 예를 들어, 구독에--path /event가 지정된 경우 이벤트가https://<base application URL>/events로 전송됩니다. -
이 앱을 배포한 후
app get명령을 실행하여 앱이ready상태인지 확인합니다.ibmcloud ce app get -n kafka-receiver-app -
다음 명령어를 사용하여 Kafka 이벤트에 대한 Code Engine Kafka 이벤트 구독을 생성하십시오.
ibmcloud ce sub kafka create명령을 사용하여 xml-ph-0002@deepl.internal 이벤트에 대한 xml-ph-0000@deepl.internal xml-ph-0001@deepl.internal 이벤트 구독을 생성하십시오. 이전에 생성한kafka-subscription-secret사용하여 메시지 브로커에 액세스합니다. Kafka 리소스에 대한 서비스 자격 증명 정보를 기반으로 브로커 정보를 지정합니다. 이 예제에서는ibmcloud resource service-key myeventstream-key명령의 출력에서 브로커 정보를 얻을 수 있습니다. 주제에 대한 각 브로커에--broker옵션을 지정해야 한다는 점에 유의하세요.--destination옵션은 이벤트를 수신할 Code Engine 리소스를 지정합니다.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 -
Kafka 이벤트 구독에 대한 세부 정보를 표시합니다.
ibmcloud ce sub kafka get -n mykafkasubscription출력 예
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
구독 테스트
kafka-receiver-app 애플리케이션을 참조하는 Kafka 이벤트 구독이 생성되었으므로, kafka-sender-app 를 사용하여 수신자 애플리케이션으로 메시지 이벤트를 전송하십시오.
-
다음 명령어를 사용하여 대상 앱(
kafka-sender-app)의 공개 URL 를 확인하십시오.ibmcloud ce app get--output url옵션을 포함한 명령어를 사용하여 앱의 URL 을 확인하십시오.ibmcloud ce app get -n kafka-sender-app --output url출력 예
https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud -
Kafka 이벤트 프로듀서 앱을 실행하여
kafka-sender-app대상 Code Engine 애플리케이션으로 이벤트를 전송합니다.curl매개변수를 사용하여kafka-sender-app애플리케이션을 호출하고, 토픽과 메시지 수에 대한 값을 지정합니다. 다음 명령어의 출력을 사용하여ibmcloud ce app get명령어의 출력 결과를 사용하여 앱의 공개 URL 를 찾으세요. 컬링할 값을 따옴표로 묶어 단일 문자열로 취급되도록 해야 합니다. 예를 들면 다음과 같습니다.curl "<public_URL_of_Kafka_sender_app>?topic=<your_topic_name>&num=<number_of_messages_to_produce>"예를 들면 다음과 같습니다.
curl "https://kafka-sender-app.abcdabcdabc.us-south.codeengine.appdomain.cloud?topic=kafka-topic1&num=1" -
로그에서 이벤트 보기. 브로커, 토픽 및 유효한 액세스 비밀번호를 사용하여 Kafka 이벤트 구독을 만들고 해당 토픽(예:
kafka-sender-app)에 대한 메시지를 생성하는 Kafka 애플리케이션이 있는 경우,kafka-receiver-app같은 Kafka 메시지를 수신하는 대상 Code Engine 애플리케이션의 로그에서 이벤트를 볼 수 있습니다. Kafka 수신기 앱icr.io/codeengine/kafka-receiver사용하는 경우 수신기 앱의 로그에서Event data검색하여 수신된 메시지를 확인합니다.ibmcloud ce app logs -n kafka-receiver-app출력 예
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앱의 로그 정보는 1시간 동안만 보관된다는 점에 유의하시기 바랍니다. 앱(또는 작업)의 로그 보기에 대한 자세한 내용은 로그 보기를 참조하세요.
구독 업데이트하기
CLI로 이벤트 구독을 업데이트하려면 ibmcloud ce subscription kafka update 명령을 사용합니다. 다음 예에서는 주제 이름을 업데이트합니다.
ibmcloud ce sub kafka update -n mykafkasubscription --topic kafka-topic2
다음 ibmcloud ce subscription kafka update 명령을 사용하여 Kafka 구독의 값을 업데이트할 수 있습니다. 그러나 이 명령으로는 소비자 그룹의 값을 수정할 수 없습니다. 구독을 업데이트하여 다른 토픽을
참조하도록 하려면, 구독을 업데이트하기 전에 ‘ Kafka ’ 토픽이 존재하는지 확인하십시오.
Kafka 구독 설정 튜토리얼 정리
Kafka 구독, 송수신 앱, 시크릿을 삭제할 준비가 되셨나요? 명령어 ibmcloud ce app delete, ibmcloud ce sub kafka delete,
ibmcloud ce sub kafka delete 사용할 수 있습니다. 선택적으로 -f 옵션을 사용하여 확인 절차 없이 컴포넌트를 강제로 삭제할 수 있습니다.
Kafka 구독을 삭제하더라도, 해당 구독에서 참조하는 앱은 삭제되지 않습니다.
구독을 제거하려면 다음을 실행하십시오.
ibmcloud ce sub kafka delete --name mykafkasubscription -f
Kafka 메시지 수신 애플리케이션을 제거하려면 다음과 같이 하세요,
ibmcloud ce app delete --name kafka-receiver-app -f
마찬가지로 kafka-sender-app 제거할 수 있습니다.
ibmcloud ce app delete --name kafka-sender-app -f
를 제거하려면 kafka-subscription-secret,
ibmcloud ce secret delete --name kafka-subscription-secret -f
Event Streams 서비스 인스턴스에 대한 서비스 인스턴스를 삭제할 준비가 되셨나요? --recursive 옵션은 해당 서비스 인스턴스에 대한 모든 리소스(관련 서비스 키 포함)를 제거하도록 지정합니다.
ibmcloud resource service-instance-delete myeventstream --recursive -f
다음 단계
Kafka 이벤트 구독 작업에 대한 자세한 내용은 Kafka 이벤트 프로듀서로 작업하기를 참조하세요.
더 많은 코드 예를 찾고 계십니까? IBM Cloud Code Engine GitHub 저장소의 예제를 확인해 보세요.