【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

路邊兩盞燈發表於2021-02-04

問題描述

事件中心提供 Kafka 終結點,現有的基於 Kafka 的應用程式可將該終結點用作執行你自己的 Kafka 群集的替代方案。 事件中心可與許多現有 Kafka 應用程式配合使用。在Azure官方提供的Demo中,都是針對Global Azure。以下內容通過實驗來一步一步除錯並在Azure中國區連線Event Hub成功。

 

操作步驟

  • 準備好Event Hub的連線字串,可以是Namespace級別的SAS connection string,也可以是Event Hub Instance(Topic)級的連線字串
    • Event Hub Namespace 級別的連線字串格式為:Endpoint=sb://mynamespace.servicebus.chinacloudapi.cn/;SharedAccessKeyName=XXXXXX;SharedAccessKey=XXXXXX
    • Event Hub Instance 級別的連線字串格式為:Endpoint=sb://mynamespace.servicebus.chinacloudapi.cn/;SharedAccessKeyName=XXXXXX;SharedAccessKey=XXXXXX;EntityPath=XXXXXX
    • 注:如果您使用的是Global Azure,Event Hub的域名地址為 *.servicebus.windows.net.

在Demo程式碼中,有兩部分程式碼傳送訊息的Producer和消費訊息的Consumer. 他們的檔案結構如下:

【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

  • Producer:使用Demo中的Producer專案程式碼,傳送訊息到事件中心,如果需要修改kafka的版本,可以在pom.xml檔案中修改kafka依賴的版本資訊。
  • Consumer:使用Demo中的Consumer專案程式碼,從開啟Kafka終結點的事件中心接受訊息。如果需要修改kafka的版本,可以在pom.xml檔案中修改kafka依賴的版本資訊。

 

第一步:修改傳送端的Kafka連線字串和TOPIC名稱

在producer.config檔案中修改bootstrap.servers 和 sasl.jaas.config 的值。使用事件中心的kafka終結點(Event Hubs Kafka endpoint)。

bootstrap.servers=youreventhubnamespacename.servicebus.chinacloudapi.cn:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://youreventhubnamespacename.servicebus.chinacloudapi.cn/;SharedAccessKeyName=manage;SharedAccessKey=xxxxxx;EntityPath=testmessage";

同時也在TestProducer.java檔案中修改TOPIC值。如這次測試中使用的是testmessage

【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

 

第二步:修改消費端的Kafka連線字串和TOPIC名稱

在consumer.config檔案中修改bootstrap.servers 和 sasl.jaas.config 的值。使用事件中心的kafka終結點(Event Hubs Kafka endpoint)。

bootstrap.servers=youreventhubnamespacename.servicebus.chinacloudapi.cn:9093
group.id=$Default
request.timeout.ms=60000
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://youreventhubnamespacename.servicebus.chinacloudapi.cn/;SharedAccessKeyName=manage;SharedAccessKey=xxxxxx;EntityPath=testmessage";

同時也在TestConsumer.java檔案中修改TOPIC值。如這次測試中使用的是testmessage

【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

 

第三步:除錯傳送端和消費端程式碼

在VS Code中直接除錯程式碼,點選F5啟動或者在Mian方法之上點選run or debug linkbutton。測試效果如:

【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

 

錯誤一:Invalid SASL mechanism response, server may be expecting a different protocol   /   Error reading field 'sasl_auth_bytes': Bytes size -1 cannot be negative

【Azure 事件中心】在微軟雲中國區 (Mooncake) 上實驗以Apache Kafka協議方式傳送/接受Event Hubs訊息 (Java版)

在開始Debug Producer程式碼時,出現了無效的SASL響應,Event Hub服務端不支援當前使用的kafka協議錯誤 (Invalid SASL mechanism response, server may be expecting a different protocol)。原來是由於使用的Event Hub定價層為基本層,而Azure支援Apache Kafka協議是在標準版和專用版。所以回到Azure Event Hub的定價層頁面,升級到標準版後就可以成功連線到事件中心(Event Hub)。

This error occurs when publishing to a basic plan Event Hub, as the basic plan does not support interaction via Kafka protocol.An upgrade to a standard plan should resolve this. https://azure.microsoft.com/en-au/pricing/details/event-hubs/

 

參考資料

Send and Receive Messages in Java using Azure Event Hubs for Apache Kafka Ecosystems: https://github.com/Azure/azure-event-hubs-for-kafka/tree/master/quickstart/java

針對 Azure 事件中心的 Apache Kafka 開發人員指南: https://docs.azure.cn/zh-cn/event-hubs/apache-kafka-developer-guide

Not able connect to EventHub via KAFKA api: https://stackoverflow.com/questions/59891094/not-able-connect-to-eventhub-via-kafka-api

 

相關文章