1. zookeeper在kafka架构中的角色?
      1. 和微服务治理框架一样,需要有一个角色了解不同模块的信息,作为分布式环境下的全局信息协调者。
    2. 为什么要zookeeper?
      1. 生产者需要知道发送消息到哪个broker。
      2. 消费者需要知道从哪个broker拉取消息。
      3. broker需要注册到zookeeper作为元数据。
    3. broker信息在zookeeper如何存储?
      1. 将broker的信息(ip、topic等)注入到一个zookeeper的临时节点上。
      2. 如果broker断连,由于zookeeper的特性,临时节点被移除。
    4. zookeeper和namesrv的区别?
      1. namesrv无状态,因为broker会和所有namesrv保持长连接,所以broker的数据和存活状态能被所有namesrv节点感知,namesrv之间相互无需通讯,它们之间的一致性由使用者保证。
      2. zookeeper节点之间存在leader和follower的角色划分,所有broker只和leader保持长连接,而zookeeper节点内的数据一致性要由zookeeper的zab协议来保证。
      3. 这样看起来,确实是namesrv是更轻量的,对于broker或者说使用者来说,注册中心的数据是否一致是能被感知到的,而zk就不能感知到,属于zookeeper内部事务。打个比方,几个中国人去国外旅游,去美国的话,中国大使馆允许和每个游客保持联系,这样能直接知道其安全状况,而去朝鲜的话,中国大使馆只允许和朝鲜安全部保持联系,游客的安全只能交给朝鲜安全部管理。
    5. zookeeper的工作流?
      1. 生产者定期向主题发送消息。
      2. Kafka broker将所有消息存储在为该特定主题配置的分区中。它确保消息在分区之间平等共享。如果生产者发送两个消息,并且有两个分区,则Kafka将在第一个分区中存储一个消息,在第二个分区中存储第二个消息。
      3. 消费者订阅一个特定的主题。
      4. 一旦消费者订阅了一个主题,Kafka将向消费者提供该主题的当前偏移量,并将偏移量保存在ZooKeeper中。
      5. 消费者将定期请求Kafka新消息。
      6. 一旦Kafka收到来自生产者的消息,它会将这些消息转发给消费者。
      7. 消费者将收到消息并处理它。
      8. 一旦消息被处理,消费者将向Kafka broker发送确认。
      9. 一旦Kafka收到确认,它会将偏移量更改为新值(并不会删除消息),并在ZooKeeper中进行更新。由于ZooKeeper中保留了偏移量,因此即使在服务器出现故障时,消费者也可以正确读取下一条消息。