https://juejin.cn/user/1574156381468286 摘要
消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。
Kafka 是一个消息系统,是一个集群模式,和HDFS有点像
Kafka里面设计了topic(主题),类似于关系型数据库的表
还有一个概念叫 Partition (分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,多个分区多个线程,多个线程并行处理肯定会比单线程好得多
Topic 也是逻辑概念,而 partition 就是分布式存储单元。
注意:
1、分区会有单点故障问题,所以我们会为每个分区设置副本数
2、分区的编号是从0开始的
Producer - 生产者
Consumer - 消费者
Message - 消息
Replica - 副本
Consumer Group - 消费者组
Kafka 的集群架构
每个副本都是有角色之分的,它们会选取一个副本作为 leader,而其余的作为follower
生产者在发送数据的时候,是直接发送到 leader partition 里面,然后follower partition 会去 leader 那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的
消费数据时会在代码里面指定一个 group.id,这个 id 代表的是消费组的名字,而且这个 group.id 就算不设置,系统也会默认设置
conf.setProperty("group.id","tellYourDream")
在 kafka 中,不同组可(且只)有唯一的一个消费者去消费同一主题的数据
所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息
因为前面提到过了消费者会直接和leader建立联系,所以它们分别消费了三个leader,所以一个分区不会让消费者组里面的多个消费者去消费,但是在消费者不饱和的情况下,一个消费者是可以去消费多个分区的数据的
kafka也是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和zookeeper 进行配合管理整个kafka集群
此时模拟一个场景,我们创建一个主题(其实就是在zookeeper上/topics/topicA这样创建一个目录而已),kafka会把分区方案生成在这个目录中,此时controller就监听到了这一改变,它会去同步这个目录的元信息,然后同样下放给它的从节点,通过这个方法让整个集群都得知这个分区方案,此时从节点就各自创建好目录等待创建分区副本即可。这也是整个集群的管理机制
Kafka 优势
顺序写 追加数据是追加到末尾,磁盘顺序写的性能极高
零拷贝
日志分段存储 Kafka规定了一个分区内的.log文件最大为1G,做这个限制目的是为了方便把.log加载到内存去操作
网络设计 kafka的网络设计和Kafka的调优有关,这也是为什么它能支持高并发的原因
如果我们需要对kafka进行增强调优,增加processor并增加线程池里面的处理线程,就可以达到效果。request和response那一块部分其实就是起到了一个缓存的效果,是考虑到processor们生成请求太快,线程数不够不能及时处理的问题。