Kafka知识点汇总

整体结构




Producer

producer依据用户指定的算法,将消息发送到指定的partition

Part


  1. kafka以topic来进行消息管理,每一个topic包括多个part(ition),每一个part相应一个逻辑log,有多个segment组成。
  2. 每一个segment中存储多条消息(见下图),消息id由其逻辑位置决定。即从消息id可直接定位到消息的存储位置。避免id到位置的额外映射。
  3. 每一个part在内存中相应一个index,记录每一个segment中的第一条消息偏移。
  4. 公布者发到某个topic的消息会被均匀的分布到多个part上(随机或依据用户指定的回调函数进行分布)。broker收到公布消息往相应part的最后一个segment上加入该消息,
  5. 当某个segment上的消息条数达到配置值或消息公布时间超过阈值时。segment上的消息会被flush到磁盘。仅仅有flush到磁盘上的消息订阅者才干订阅到。
  6. segment达到一定的大小后将不会再往该segment写数据。broker会创建新的segment。

Broke

  1. 消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能
  2. 直接使用linux 文件系统的cache,来高效缓存数据。
  3. 即使消息被消费,消息仍然不会被马上删除.日志文件将会依据broker中的配置要求,保留一定的时间之后删除
  4. 採用linux Zero-Copy提高发送性能。

  5. Topic划分为多个partition,提高parallelism
  6. 能够通过实现Partitioner接口来定制Partition的分区规则
  7. At least one 消息绝不会丢。但可能会反复传输
  8. 通过冗余机制来保证信息的安全
  9. 一个Broke能够包括多个Topic的Part,一个Topic也能够将多个Part分布到不同的不同的Broke上
  10. 数据压缩:支持GZIP和Snappy压缩协议

Consumer 公共特性

  1. Consumer依据消费能力自主控制消息拉取速度
  2. Consumer依据自身情况自主选择消费模式,比如批量,反复消费,从尾端開始消费等

Lower Level Consumer

  1. Consumer从kafka集群pull数据
  2. Consumer负责维护消息的消费记录,控制获取消息的offset
  3. Consumer可将offset设成一个较小的值,又一次消费一些消息
  4. 必须找出指定Topic Partition中的lead broker
  5. 加入事务管理机制以保证消息被处理且仅被处理一次
  6. 在一个处理过程中仅仅消费Partition当中的一部分消息

High Level Consumer 

  1. High Level模式下的Group Name 是整个Kafka集群的全局变量
  2. 消息消费以Consumer Group为单位,每一个Consumer Group中能够有多个consumer,每一个consumer是一个线程。topic的每一个partition同一时候仅仅能被某一个consumer读 取。Consumer Group相应的每一个partition都有一个最新的offset的值,存储在zookeeper上的。

    所以在正常情况下不会出现反复消费的情况。

  3. 由于consumer的offerset并非实时的传送到zookeeper(通过配置来制定更新周期)。所以Consumer假设突然Crash,有可能会读取反复的信息
  4. High Level Consumer 能够而且应该被使用在多线程的环境,线程模型中线程的数量(也代表group中consumer的数量)和topic的partition数量有关,以下列举一些规则:

    1. 当提供的线程数量多于partition的数量。则部分线程将不会接收到消息;
    2. 当提供的线程数量少于partition的数量,则部分线程将从多个partition接收消息;
    3. 当某个线程从多个partition接收消息时,不保证接收消息的顺序;可能出现从partition3接收5条消息,从partition4接收6条消息。接着又从partition3接收10条消息。
    4. 当加入很多其它线程时,会引起kafka做re-balance, 可能改变partition和线程的相应关系。


Consumer Group

  1. 同意consumer group(包括多个consumer。如一个集群同一时候消费)对一个topic进行消费。不同的consumer group之间独立订阅。互不干扰。

  2. brokerconsumer增加或离开时会触发负载均衡算法,使得一consumer group内的多个consumer的订阅负载平衡
  3. 每一个partition仅仅会被consumer group内的一个consumer消费,故kafka保证每一个partition内的消息会被顺序的订阅,但多个Consumer Group可同一时候消费这一消息。
  4. 每一个Consumer属于一个特定的Consumer Group(可为每一个Consumer指定group name,若不指定group name则属于默认的group
  5. 假设须要实现广播,仅仅要每一个Consumer有一个独立的Group
  6. 要实现单播仅仅要全部的Consumer在同一个Group里

Zookeeper

  1. 每一个broker启动后会在zookeeper上注冊一个暂时的broker registry,包括brokerip地址和port号。所存储的topicspartitions信息。

  2. 每一个consumer启动后会在zookeeper上注冊一个暂时的consumer registry:包括consumer所属的consumer group以及订阅的topics
  3. 每一个consumer group关联一个暂时的owner registry和一个持久的offset registry。对于被订阅的每一个partition包括一个owner registry。内容为订阅这个partitionconsumer id;同一时候包括一个offset registry。内容为上一次订阅的offset



posted @ 2017-05-21 13:21  wzzkaifa  阅读(141)  评论(0编辑  收藏  举报