簡體   English   中英

具有相同GroupId的多個Kafka偵聽器全部接收消息

[英]Multiple Kafka Listeners With Same GroupId All Receiving Message

我在我們的Spring Boot應用程序中配置了一個kafka偵聽器,如下所示:

@KafkaListener(topicPartitions = @TopicPartition(topic = 'data.all', partitions = { "0", "1", "2" }), groupId = "kms")
public void listen(ObjectNode message) throws JsonProcessingException {
    // Code to convert to json string and write to ElasticSearch
}

此應用程序已部署到3個服務器上並在3個服務器上運行,盡管所有這些都具有kms的組ID,但它們都獲得了消息的副本,這意味着我在Elastic中獲得了3條相同的記錄。 當我在本地運行實例時,將寫入4個副本。

我已經確認生產者通過檢查寫入前后該主題上所有消息的計數,只向該主題寫入1條消息; 它只會增加1。如何預防呢?

當您手動分配分區時,您負責在實例之間分配分區。

該組被忽略。

您必須使用組管理,並讓Kafka為您分配分區,或者為每個實例手動分配分區。

代替topicPartitions ,使用topics = "data.all"

不手動分配分區時會發生什么

生產方

  • 當生產者發送沒有任何策略的消息或指定應將消息分配到哪個分區時,kafka會嘗試使用循環輪詢技術,並將所有消息分配到所有可用分區中。
    • 2個分區中的消息是唯一的,因為建議最多僅1個使用者來收聽主題的特定分區。

消費者方

  • 例如,一個主題有2個分區
  • 然后,一個消費者(讓我們說A )與消費者組(讓我們說consumer )一起加入
  • 每當新的使用者加入並且將2個分區分配給A時,就會發生分區重新分配,因為我們只有一個使用者組consumer
  • 現在,消費者B嘗試加入同一消費者組consumer然后再次發生分區重新分配,並且A和B都將獲得分區以收聽消息
  • 因為我們只有2個分區,所以即使我們向同一使用者組添加更多使用者,也將只有2個使用者正在偵聽發送給該主題的消息,因為一次只有2個使用者可以獲得1-1分區。 保持消費者使用的消息的排他性。

在您的情況下,發生的事情是,有多個消費者正在收聽同一分區,因此所有在同一消費者組中收聽相同分區的消費者也將從該分區接收消息。 因此,由於一個以上的消費者在監聽相同的分區,因此消費者組中的消費者之間的互斥性消失了。

暫無
暫無

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

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