borker: Kafka的服务器端由被称为broker的服务进程构成,即一个Kafka集群由多个broker组成
  borker负责接收和处理客户端发送过来的请求,以及对消息进行持久化
  虽然多个borker进程能够运行在同一台机器上,但更常见的做法是将不同的borker分散运行在不同的机器上,这样如果集群中某一台机器宕机,其他机器上的borker也依然能够对外提供服务

topic: 相当于传统消息系统MQ中的一个队列queue ,每条发布到Kafka集群的消息属于的类别,即Kafka是面向topic的
  物理上不同topic的消息分开存储(表现于日志落地),逻辑上一个topic的消息索然保存于一个或多个broker上,但用户只需要指定消息的topic即可生产或消费数据而不必关心数据存于何处
  一个topic是对一组消息的归纳,对每个topic,Kafka对它的日志进行了分区
  每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中,分区中的每个消息都有一个连续的序号叫做offset,用来在分区中唯一的标识这个消息
在一个可配置的时间段内,Kafka集群保留所有发布的消息,不管这些消息有没有被消费。比如,如果消息的保存策略被设置为48小时,那么在一个消息被发布的48小时内,它都是可以被消费的,之后它将被丢弃以释放空间
  实际上每个consumer唯一需要维护的数据是消费在日志中的位置,也就是offset,这个offset由consumer来维护,一般情况下锁着consumer不断的读取消息,这个offset的值不断增加,但其实consumer可以以任意的顺序读取消息,比如它可以将offset设置成为一个旧的值来重读之前的消息

producer: 负责发布消息到Kafka broker,Producer将消息发布到它指定的topic中,并负责决定发布到哪个分区(low API)。通常简单的由负载均衡机制随机选择分区,但也可以通过特定的分区函数选择分区。

consumer: 消费者,从Kafka集群中消费消息的终端或服务

consumer group: 每个consumer都属于一个consumer group,每条消息只能被consumer group中的一个consumer消费,但可以被多个consumer group消费
  可为每个consumer指定group name,若不指定group name则属于默认的group
  每个consumer都会属于一个消费者组,具有相同的group.id,的消费客户端属于同一个消费者。通过设置一个消息消费者group.id是否相同可以分为单播消费或广播消费
  假如一个消费者组有两个消费者,订阅了一个具有4个分区的topic的消息,那么这个消费者组的每一个消费者都会消费两个分区的消息。消费者组的成员是动态维护的,如果新增或者减少了消费者组中的消费者,那么每个消费者消费的分区的消息也会动态变化。比如原来一个消费者组有两个消费者,其中一个消费者因为故障而不能继续消费了,那么剩下一个消费者将会消费全部4个分区的消息
  一个topic可以有多个consumer group,topic的消息会复制(不是真的复制,是概念上的)到所有的consumer group,但每个consumer group指挥吧消息发送给组中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的group就可以了,要实现单播只要所有的consumer在同一个group中

partition: 分区,一个topic的消息实际上由多个队列存储的,一个队列在Kafka上称为一个分区
  为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。Kafka只保证按一个partition中的顺序将消息发送给consumer,不保证一个topic的整体(多个partition之间)顺序

offset: 偏移量。Kafka为每条在分区的消息保存一个偏移量offset,这也是消费者在分区的位置。比如一个偏移量是5的消费者,表示已经消费了从0-4偏移量的消息,下一个要消费的消息的偏移量是5

Replica: 备份
  备份的思想很简单,就是把相同的数据拷贝到多台机器上,而这些相同的数据拷贝在Kafka中被称为副本(Replica)
副本的数量是可配置的,这些副本保存着相同的数据,但却有不同的角色和作用
  领导者副本(Leader Replica): 对外提供服务,即与客服端程序进行交互(生产者总是向领导者副本写消息)
  追随者副本(Follower Replica): 只是被动地追随领导者副本而已(向领导者副本发送请求,请求领导者把最新生产的消息发送给它,这样能保持与领导者的同步),不能与外界进行交互

Kafka的三层消息架构
  第一层是主题层: 每个主题可以配置M个分区,而每个分区又可以配置N个副本
  第二层是分区层: 每个分区的N个副本中只能由一个充当Leader,对外提供服务,其他N-1个副本是Follower,只是提供数据冗余之用
  第三层是消息层: 分区中包含若干条消息,每条消息的位移从0开始,依次递增
  最后,客户端程序只能与分区的Leader副本进行交互