一個典型的Kafka集群中包含若干Produce,若干broker(一般broker數量越多,集群吞吐率越高),若干Consumer Group,以及一個Zookeeper集群。Kafka通過Zookeeper管理集群配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。Producer使用push模式將消息發布到broker,Consumer使用pull模式從broker訂閱並消費消息。

1)Producer端直接連接broker.list列表,從列表中返回TopicMetadataResponse,該Metadata包含Topic下每個partition leader建立socket連接並發送消息.
2)Broker端使用zookeeper用來注冊broker信息,以及監控partition leader存活性.
3)Consumer端使用zookeeper用來注冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partition leader建立socket連接,並獲取消息。
Zookeeper作用:管理broker、consumer
創建Broker后,向zookeeper注冊新的broker信息,實現在服務器正常運行下的水平拓展。具體的,通過注冊watcher,獲取partition的信息。
Topic的注冊,zookeeper會維護topic與broker的關系,通/brokers/topics/topic.name節點來記錄。
Producer向zookeeper中注冊watcher,了解topic的partition的消息,以動態了解運行情況,實現負載均衡。Zookeepr不管理producer,只是能夠提供當前broker的相關信息。
Consumer可以使用group形式消費kafka中的數據。所有的group將以輪詢的方式消費broker中的數據,具體的按照啟動的順序。Zookeeper會給每個consumer group一個ID,即同一份數據可以被不同的用戶ID多次消費。因此這就是單播與多播的實現。以單個消費者還是以組別的方式去消費數據,由用戶自己去定義。Zookeeper管理consumer的offset跟蹤當前消費的offset。
kafka使用ZooKeeper用於管理、協調代理。每個Kafka代理通過Zookeeper協調其他Kafka代理。
當Kafka系統中新增了代理或某個代理失效時,Zookeeper服務將通知生產者和消費者。生產者與消費者據此開始與其他代理協調工作。
Zookeeper在Kakfa中扮演的角色:Kafka將元數據信息保存在Zookeeper中,但是發送給Topic本身的數據是不會發到Zk上的
· kafka使用zookeeper來實現動態的集群擴展,不需要更改客戶端(producer和consumer)的配置。broker會在zookeeper注冊並保持相關的元數據(topic,partition信息等)更新。
· 而客戶端會在zookeeper上注冊相關的watcher。一旦zookeeper發生變化,客戶端能及時感知並作出相應調整。這樣就保證了添加或去除 broker時,各broker間仍能自動實現負載均衡。這里的客戶端指的是Kafka的消息生產端(Producer)和消息消費端(Consumer)
· Broker端使用zookeeper來注冊broker信息,以及監測partitionleader存活性.
· Consumer端使用zookeeper用來注冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partitionleader建立socket連接,並獲取消息.
· Zookeer和Producer沒有建立關系,只和Brokers、Consumers建立關系以實現負載均衡,即同一個ConsumerGroup中的Consumers可以實現負載均衡(因為Producer是瞬態的,可以發送后關閉,無需直接等待)
