kafka扫盲篇
1.kafka是什么?
kafka是一个消息中间件,是一种分布式消息发布--订阅系统。它的作用可以通过一个例子来粗略理解:
例:有两个角色,生产者---用于生产鸡蛋、消费者---消费鸡蛋,生产者直接把生产的鸡蛋提供给消费者,考虑几个情景:
i)如果生产者一单位时间内生产一个鸡蛋,而消费者一单位时间内消费一个鸡蛋,则该过程可以顺利进行;
ii)如果生产者生产一个鸡蛋,而消费者在吃鸡蛋的过程中噎住了(信息堵塞),但是生产者仍继续生产,就会导致新生产的鸡蛋丢失了(无人消费)。
iii)如果生产者一单位时间生产十个鸡蛋,但是消费者一单位时间只能消费5个鸡蛋,生产大于消费,仍会导致鸡蛋丢失。
情景i)和ii)是使用一般的通信方法会带来的问题。为了解决这种问题,我们可以找一个中间组件:如果我们有一个篮子,该篮子用于存放生产者所生产的鸡蛋,而消费者从篮子里获取鸡蛋进行消费。采用这种方式的话,我们就只需要考虑篮子够不够大?只要篮子够大,生产者生产的鸡蛋就不会丢失了。
如果把消息当成上述例子中的鸡蛋,把消息发送方当成生产者,把消息接收方当成消费者,则kafka的作用就类似于篮子,给消息提供一个中间存放的平台,来保证消息不会应为接收方出现问题而丢失。
2.kafka中的角色
Broker:安装了kafka的节点
Topic:话题,kafka是根据话题对消息进行分类存储的,每条消息都归属与一个话题
partition:分区,每个主题都有多个分区,一条消息会存入一个分区
Replicate:副本,每个分区有多个副本(备份),用来防止数据丢失
Leader:每个分区的管理者,kafka的读写都是通过leader完成的
Follower:当Leader挂了之后,会从Follower中选举新的Leader
Producer:生产者,向主题中写入数据
Consumer:消费者,从主题中读取数据
Consumer Group:消费组
Controller:管理者(zookeeper集群),完成leader选举之类的。
3.kafka的读写
i)生产者在向kafka写入数据的时候,需要指定写入的主题(topic),然后按顺序进行磁盘写入
ii)消费者往kafka读取数据时,也需要指定读取的主题,读取方式是,先读取完一个数据分区之后,才会读取下一个数据分区,因此,我们获取得到的数据顺序并不一定写入的顺序。
iii)一条数据只能被同一个Consumer Group消费一次。因为kafka会给每一个group对每个分区分配一个偏移量(我觉得可以理解为顺序表的读取方式)来记录这个group获取到消息队列中的哪个位置。
iv)数据读取时,数据的定位方法 topic--> group --> partition --> offset(偏移量)
4.kafka的一些管理机制
i)所有的leader均匀分布在所有的broker上
ii)副本数不超过broker数量
iii)如果某节点挂了,会为该节点担任leader的分区重新选举leader
iv)经过一定时间段,系统会重新分配leader,来保证leader均匀分布在所有broker上 (rebalance)
v)消费时,默认从最新数据开始消费,可通过参数选择是否从头开始消费