学习kafka的原因是因为,最近在写IM软件需要使用到消息队列,同时工作上用的是kafka,没怎么接触过,所以就选择了kafka来学习
Kafka相关名词
Broker 一个Kafka实例也被称为broker,一台服务器可以有一个或者多个broker,每个broker有个唯一的ID,broker相当于一个数据库实例
Topic 主题,Kafka的消息就是存储在topic里,一个broker可以有多个主题,topic相当于数据库中的表
Partition 分区,一个topic里可以有多个分区,每个分区的数据不相同,每个分区也有自己的ID,从0开始,partition是提高Kafka负载和吞吐量的关键
Replication 副本,每个分区都可以设置多个副本,副本是Kafka高可用的保证,副本有主副本(Leader)和副副本(Follower),平时工作的是主副本,主副本把数据同步给副副本,当主副本挂了后,副副本就会补上变成主副本,所以主副本不能跟副副本在同一台机器上,副本的数量不能超过broker数量
Producer 生产者,生成消息并发送给topic的地方
Consumer 消费者,消费消息的地方,多个消费者就组成了消费者组,同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据
zookeeper ZK,Kafka依赖ZK来保存元数据,但从2.8版本开始的Kafka可以不需要ZK,就能运行
offset 偏移量,记录消费者消费当前的位置
Kafka基本架构
- 生产和消费都是跟Leader进行交互,Leader再把数据同步给Follower
- producer是顺序写入磁盘,提高了效率,同时保证有序性,同一分区内的数据都是有序的
- producer写topic时根据三个条件来判断该写入哪个分区,a 如果写入的信息指定分区,那就写入指定的分区。b 如果写入的信息没有指定分区但是指定了key,则会根据hash映射一个分区写入。c 如果写入的消息既没有指定分区也没有key,那么就会轮询的写入分区,比如这次写入分区0,下次就写入分区1,以此类推
- 那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?那就是通过ACK应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。
....未完待续