在反復的調試過程中,我意識到這兩個consumer反復重新加入group中,而他們的group是同一個,猜測是兩個consumer使用同一個groupid導致,相互影響。在分別為兩個consumer指定了單獨的groupid之后,異常的情況沒有再出現。
基於這種現象,查詢了一些資料,在一篇blog中找到了比較詳細的講解
https://olnrao.wordpress.com/2015/05/15/apache-kafka-case-of-mysterious-rebalances/
文章中提到,消費者在zookeeper中注冊中,消費者注冊標識符(Consumer Identifiers Registry)是保存在zookeeper的/consumers/[group_id]/ids/[consumer_connector_id]的路徑下,這些消費者注冊節點形成一棵樹,當有消費者加入或離開時,樹上所有的消費者都會被通知到,從而進行rebanlance。
消費者在zookeeper注冊的路徑與topic並沒有關系,反而與groupid綁定,這是因為同一個consumer可以消費不同的topic。如果不同的consumer使用同一個groupid消費不同的topic,而任何一個topic的consumer出現加入或離開等變化時,所有groupid組里的consumer都會發生rebanlance。從而可能導致上面調試時出現的問題。
所以kafka 不同的consumer需要使用不同的group id,以減小相互之間的影響。