概览
Producer
生产者发送消息给broker,并不是生成一条消息后立刻发送,而是积攒多条后,批量发送到broker。可以通过配置参数batch.size
(单位字节)调整积攒多少后发送
Consumer
Topic
消息的分类
当Producer发送指定topic的消息时,若在server端不存在该topic,可通过配置参数auto.create.topics.enable
(默认true,在生产中不建议开启)决定是否自动创建
-
Partition(分区)
为了降低topic在单个broker上的压力,创建topic时可以为该topic指定分区数量,将该topic的分区分布到不同的broker上,这样当producer发送指定topic的消息时,可以将这些消息分布存储到该topic的分区所在的broker上
当多个消费者监听同一个topic的消息时,属于同一个消费者组的消费者可以分别消费不同的分区中的消息,如有三个分区,三个消费者,则每个消费者各消费一个分区中的消息
-
副本
为了支持高可用,即使集群某台broker宕机,也能正常提供服务,为每个分区创建多个副本,如下topicA指定了三个分区和两个副本
leader
和follower
同一个分区的多个副本中会选出一个作为leader,其他作为follower,客户端(Producer和Consumer)只和leader交互。
follower从leader同步数据,leader宕机后会从其他follower中选举出一个成为新的leadercontroller
Cosumer Group
生产者生产的消息越来越多,若单个消费者的消费能力不够,则消息会在server端产生堆积,为了提高消费能力,可增加多个消费者,每个消费者至少消费一个分区中的数据,为了避免分区的数据被重复消费,可将这些消费者划分为一个组(设置group.id)
同一个消费者组中的消费者会分配不同的分区去消费,不存在一个以上的消费者消费同一个分区的情况
如果消费者数量大于分区数量,则多余的消费者不消费数据
offset
消费者组在单个分区上消费消息的偏移量
存储机制
分区在broker上的存储形式
.index
文件:索引文件
.log
文件:存放数据的文件
.timeindex
文件:存放时间索引的问题
segment
随着消息的不断增加,存储的文件越来越大,检索效率会越来越低。当文件增大到指定log.segment.bytes大小后,将会创建新的文件用于存储新的数据内容,每个segment都会对应一套.log
.index
.timeindex
文件