訂閱 Kafka 的活動
透過本教學,您可以學習如何使用 IBM Cloud® Code Engine CLI 訂閱 Kafka 事件。
在分散式環境中,您通常希望應用程式或工作對從其他元件 (通常稱為事件生產者) 產生的訊息 (事件) 做出反應。 透過 Code Engine,您的應用程式或工作可透過訂閱事件產生者,接收感興趣的事件。 應用程式會透過 POST HTTP 請求接收事件資訊,而工作則透過環境變數接收事件資訊。
Kafka 事件生產者會監看新訊息出現在 Kafka 實例中。 當您針對一組主題建立 Code Engine Kafka 訂閱時,您的應用程式或工作會針對出現在其中一個主題中的每一則新訊息收到個別事件。
雖然您可以使用任何 Kafka 實例,但本教學中的範例均採用 IBM® Event Streams for IBM Cloud® 服務。Event Streams 是一項 IBM 事件串流服務,專門用於處理 Kafka 事件。 如需有關此服務的更多資訊,請參閱 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 訂閱時,需要此資訊。password和apikey的值在 Event Streams 服務實例的服務金鑰中是相同的。 您也可以使用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 Kafka 事件訂閱需要這些認證,才能與 Event Streams的服務實例進行通訊。 雖然在建立 Kafka 傳送端應用程式及事件訂閱之前不需要您建立此密鑰,但此動作可簡化必要的步驟。若要建立
kafka-subscription-secret密鑰,請為password及username新增文字環境變數。 如需相關資訊,請參閱 使用 CLI 建立密鑰。- 使用 Event Streams 服務實例中服務認證的詳細資料中列出的
user值來指定username金鑰。 對於 Event Streams 服務實例,此值為token。 Code Engine Kafka 事件訂閱與 Kafka 訊息分配管理系統之間的鑑別需要此金鑰。 - 使用 Event Streams 服務實例中服務認證的詳細資料中列出的
apikey值來指定password金鑰。 寄件者範例以及啟用 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建置,可從 Samples for IBM Cloud Code Engine GitHub repo取得。 此範例傳送端應用程式需要儲存在kafka-subscription-secret中的password認證,並且它需要BROKERS環境變數。 - 指定
--env-from-secret選項以參照包含password認證的完整密鑰kafka-subscription-secret。 - 指定
--env選項以新增文字環境變數BROKERS,並提供 Event Streams 服務實例中服務認證詳細資料所列出其中一個分配管理系統主機的名稱。 不過,如果您想要指定多個分配管理系統主機名稱,請使用--env BROKERS-broker1,broker2,broker3格式。 - (選用) 指定
--min-scale=1選項,讓應用程式一律具有執行中且不會調整為零的實例。 當您檢視日誌時,將應用程式配置成一律具有執行中實例非常有用。 如果您在正式作業環境中執行,請考量保留應用程式執行中實例的成本,或者您是否想要 Code Engine 自動調整為零。 依預設,不在使用中時,應用程式會調整為零。
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
您已建立 kafka-sender-app 應用程式來產生 Code Engine 事件訂閱的 Kafka 訊息,並已建立包含必要認證的 kafka-subscription-secret 密鑰。
設定 Code Engine Kafka 訂閱
若要讓 Code Engine 與 Kafka 事件配合運作,請設定 Code Engine Kafka 事件訂閱,以連線至 Kafka 事件中介伺服器,並監聽 Kafka 事件。 此外,請設定一個 Code Engine 應用程式,用以接收 Kafka 的事件。 Kafka 事件訂閱定義了 Kafka 事件產生者(發送方)與事件接收者(接收方)之間的關係。
Code Engine Kafka 事件訂閱會連線至您的 Kafka 訊息中介伺服器,並針對每則傳入的 Kafka 訊息,向接收端應用程式發送 HTTP POST 請求。 如需進一步了解 Kafka 事件所包含的資訊,請參閱 HTTP 中關於傳送至應用程式的事件的標頭與正文資訊。
-
建立 Code Engine 應用程式,以充當 Kafka 訊息的事件消費者,並接收 Kafka 事件。 例如,建立一個稱為
kafka-receiver-app的應用程式,以使用icr.io/codeengine/kafka-receiver映像檔。 此映像檔是從receiver.go建置,可從 Samples for IBM Cloud Code Engine GitHub repo取得。 此範例不需要任何環境變數。 您可以選擇性地指定--min-scale=1選項,讓應用程式一律具有執行中且不會調整為零的實例。 當您檢視日誌時,將應用程式配置成一律具有執行中實例非常有用。 如果您在正式作業環境中執行,請考量保留應用程式執行中實例的成本,或者您是否想要 Code Engine 自動調整為零。 依預設,不在使用中時,應用程式會調整為零。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 -
使用
ibmcloud ce sub kafka create指令,為 Kafka 事件建立 Code Engine Kafka 事件訂閱。 使用您先前建立的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 將訊息事件傳送至接收端應用程式。
-
URL
kafka-sender-app使用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,以確保將它視為單一字串。 例如,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 應用程式會產生該主題的訊息 (例如
kafka-sender-app),則您可以在日誌中看到目的地 Code Engine 應用程式的事件,該應用程式會接收 Kafka 訊息,例如kafka-receiver-app。 當您使用 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請注意,應用程式的日誌資訊只會持續一小時。 如需檢視應用程式 (或工作) 日誌的相關資訊,請參閱 檢視日誌。
更新訂閱
若要使用 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 儲存庫中的範例。