簡體   English   中英

為 Kafka 創建 Spring Cloud Data Flow 主題

[英]Spring Cloud Data Flow topics creation for Kafka

我有自己的 Spring Cloud Data Flow 處理器,里面有 Python,我使用這個示例作為指導: https : //dataflow.spring.io/docs/recipes/polyglot/processor/ 然后我想擴展並創建三個這樣的處理器,所以使用spring.cloud.deployer.myApp.count=3我創建了 3 個包含 Python 的 pod。 我稍微修改了示例中的代碼:當我創建 Kafka 消費者時,我還傳遞了一個組 ID,因此應該對消息進行負載平衡。

consumer = KafkaConsumer(get_input_channel(), group_id=get_consumer_group(), bootstrap_servers=[get_kafka_binder_brokers()])

問題是 SCDF 創建了一個只有 1 個分區的 Kafka 主題,因此消息只能到達一個 pod。 所以我想知道:

  • 我應該以某種方式配置 SCDF 以創建具有 3 個分區的 Kafka 主題嗎?
  • 還是我不應該依賴 SCDF 並在 Python 中自己創建主題? 我想這將是多余的,因為 SCDF 也創建了這個主題。
  • SCDF 中的哪個組件實際上負責創建 Kafka 主題? 我如何影響它的分區數量?
  • 如果我停止此流並使用 4 個處理器步驟再次啟動,是否應使用第 4 個分區擴展主題? 因為目前沒有創建新分區。

請花點時間回顧一下 Spring Cloud Data Flow 的職責 如果不清楚,SCDF 既不會與 Kafka 等支持消息傳遞中間件交互,也不會在運行時使用它。 換句話說,SCDF 不會創建與之關聯的主題或分區——它只是自動配置 Spring Cloud Stream (SCSt) 屬性。

但是,如果您在自定義處理器中使用 SCSt,則該框架會自動將所需通道綁定到中間件中的基礎主題。 該框架還具有更改分區行為的功能。 您也可以使用過度分區的主題部署處理器。 還有其他幾個配置選項可以構建所需的流數據處理行為。

您正在查看的 Python 示例不具備 SCSt 提供的所有功能。 該秘籍是一個示例演練,說明某人如何在 Python 中構建本機處理器風格的應用程序,其中生產者和消費者配置是在 Python 代碼本身中手動創建的。 SCDF 和 SCSt 都不會影響此配方中的應用程序行為。

我應該以某種方式配置 SCDF 以創建具有 3 個分區的 Kafka 主題嗎?

如前所述,SCDF 不與 Kafka 交互。

還是我不應該依賴 SCDF 並在 Python 中自己創建主題? 我想這將是多余的,因為 SCDF 也創建了這個主題。

如果您的自定義處理器不是 Spring Cloud Stream 應用程序,是的,您有責任在代碼中明確定義主題 + 分區。

SCDF 中的哪個組件實際上負責創建 Kafka 主題? 我如何影響它的分區數量?

春雲流。 請參閱上面的解釋。

如果我停止此流並使用 4 個處理器步驟再次啟動,是否應使用第 4 個分區擴展主題? 因為目前沒有創建新分區。

您不一定需要重新啟動流數據管道。 如果您的主題預先過度分區,是的,運行時任何額外的消費者都應該能夠自動參與競爭消費者關系。 密切關注spring-io/dataflow.spring.io#156 — 我們正在添加一個配方來演示使用 SCSt + SCDF + Kafka 的手動和自動縮放的可能性。

能夠通過將以下代碼引入 Python 容器啟動腳本( https://dataflow.spring.io/docs/recipes/polyglot/processor/ 中提供的改進代碼)來解決此問題。 使用 SCDF 服務器傳遞的參數來獲取代理 URL、主題名稱、實例數:

admin_client = KafkaAdminClient(bootstrap_servers=[get_kafka_binder_brokers()], client_id=sys.argv[0])

partition_count = get_cmd_arg("spring.cloud.stream.instanceCount")

# create Kafka topic if does not exist
new_topic = NewTopic(name=get_input_channel(), num_partitions=partition_count, replication_factor=1)
try:
    admin_client.create_topics(new_topics=[new_topic])
except TopicAlreadyExistsError:
    logging.info(f"Topic {get_input_channel()} was already created")

# add Kafka partitions to existing topic
new_partitions = NewPartitions(total_count=partition_count)
try:
    admin_client.create_partitions(topic_partitions={get_input_channel(): new_partitions})
except InvalidPartitionsError as exp:
    logging.info(f"No need to increase Kafka partitions for topic {get_input_channel()}")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM