簡體   English   中英

消息處理Kafka的多個節點

[英]multiple nodes for message processing Kafka

我們有一個 spring 啟動應用程序部署在 Kubernetes 上,它處理消息:它從 Kafka 主題讀取,然后進行一些映射,最后,它寫入 Kafka 主題

為了獲得更高的性能,我們需要更快地處理消息,因此我們引入了這個 spring 啟動應用程序的多個節點。

但我相信這會導致問題,因為:

  • 消息應按順序處理

  • 該消息包含 state

是否有任何解決方案可以使消息保持有序,並保證一個節點已經處理的消息不會被另一個節點處理,並解決由多個節點處理引起的任何其他問題。

請隨時提出所有可能的解決方案,因為我們正在構建 POC。

使用 apache flink 或 spring-cloud-stream 對這件事有幫助嗎?

在消費來自 Kafka 的消息時,記住消費者組的概念很重要。 這個概念確保從 Kafka 主題讀取並共享同一個 Consumer Group 的節點不會相互干擾。 消費者組中的一個消費者已閱讀的內容將不會被同一消費者組的另一消費者再次閱讀。

此外,讀取和寫入 Kafka 的應用程序隨 Kafka 主題中的分區數量而擴展。

如果您有多個節點使用只有一個分區的主題,則不會有任何影響,因為一個分區只能從消費者組中的單個消費者讀取。 您將在有關Consumers的 Kafka 文檔中找到更多信息。

當您有一個包含多個分區的主題時,排序可能會成為一個問題。 Kafka 只保證分區內的順序。

這是 Kafka 文檔的摘錄,描述了消費者組和分區之間的交互

通過在主題中擁有並行概念(分區),Kafka 能夠在消費者進程池上提供排序保證和負載平衡。 這是通過將主題中的分區分配給消費者組中的消費者來實現的,以便每個分區僅由組中的一個消費者使用。 通過這樣做,我們確保消費者是該分區的唯一讀取者並按順序使用數據。 由於有許多分區,這仍然可以平衡許多消費者實例的負載。 但是請注意,消費者組中的消費者實例不能多於分區。

使用 Flink 進行擴展的限制將是 Kafka 主題中的分區數量——換句話說,Flink 的 Kafka 消費者的每個實例都將連接到一個或多個分區並從中讀取。 使用 Flink,除非您重新分區數據,否則將保留順序。 Flink 確實提供了exactly-once 的保證。

一起體驗 Flink 和 Kafka 的快速方法是探索 Flink 的操作游樂場 這個 dockerized 游樂場的設置是為了讓您探索重新縮放、故障恢復等,並且應該使這一切更加具體。

您可以在單個應用程序中運行多個使用者線程,甚至可以使用多個使用者線程運行多個應用程序。 當所有消費者屬於同一個組並且 Kafka 主題有足夠的分區時,Kafka 會在主題分區之間進行平衡。

一個分區中的消息始終是有序的,但要通過消息鍵保持順序,您應該設置max.in.flight.requests.per.connection=1 代理總是在同一個分區中寫入具有相同鍵的消息(除非您更改分區號),因此您將對具有相同鍵的所有消息進行排序。

一個分區由唯一的一個消費者讀取,因此當另一個消費者獲得處理的消息時,唯一的方法是在消息被確認之前重新平衡分區。 您可以設置ack-mode=MANUAL_IMMEDIATE並在處理后立即確認消息或使用其他確認方法。

我建議閱讀這篇文章https://medium.com/@felipedutratine/kafka-ordering-guarantees-99320db8f87f

暫無
暫無

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

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