目录
个人原创总结之 kakfka 原理
重要概念
1 重要概念
生产者:推送消息到指定到topic中,并负责决定发布到哪个分区;两种推送方式,一种是简单到负载均衡,另外一种是语义分区算法(比如基于一些键值取模)
消费者:拉去pull消息
消费者组Consumer Group:
实例Broker:管理主题中的消息存储时,集群就是通过多个实例组成
主题Topic:一堆或一组消息,是一个逻辑概念,一个主题由多个分片(partition)组成,代表一系列/一种分类
分片Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队
offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息;
message:这个算是kafka文件中最小的存储单位,即是 a commit log。
replia:Kafka保存了多个备份日志,在 Kafka 中被称为副本( replica ),它们存在的唯一目的就是防止数据丢失。副本分为两类 : 领导者副本( leader replica )和追随者副本( follower replica )
ISR:就是与 leader replica 保持同步的 replica 集合。Kafka 为 partition 动态维护 一个 replica 集合
OSR:落后与leader replica的副本集合
AR:所有副本集合 = ISR + OSR
工作模式图
ack三种机制
1)0:product不需要等broker确认,就继续发送
2)1:product 等待一个leader确认,就可以继续发送
3)-1(all):product 等待所以follwer确认,才可以继续发送
如何避免重复消费(如何保证消息的幂等性)
可以通过redis,写一个全局的ID,因为redis是天然的幂等性。然后每次拿数据先redis读一下。没有的话就先写redis,有的话就不处理了
如何确保消息不丢
1)acks = all 代表则所有副本都要接收到该消息之后该消息才算真正成功被发送。
2)replication.factor >= 3 保证每个 分区(partition) 至少有 3 个副本。虽然造成了数据冗余,但是带来了数据的安全性。
3) min.insync.replicas > 1 代表消息至少要被写入到 2 个副本才算是被成功发送。
4)unclean.leader.election.enable = false当 leader 副本发生故障时就不会从 follower 副本中和 leader 同步程度达不到要求的副本中选择出 leader ,这样降低了消息丢失的可能性。
如何确保消息顺序消费
kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。 但是整个topic不保证有序。因为topic包括了多个分区partition,如果为了保证topic整个有序,那么将partition调整为1即可。
Kafka吞吐量为什么如此高
1)零拷贝机制 更多的是磁盘的一种机制正常read->内核态 拷贝到 用户态->write-> 用户态 拷贝到内核态到缓冲区 ->最后将缓冲区到内容传到网卡设备;0拷贝就是read->缓冲区
2)磁盘顺序读写 磁盘的顺序读写比内存的随机读写快很多。不断的往磁盘文件后面追加顺序写,每个消费者根据offest来消费读取分片的消息
3)分区段+索引 paration分区实际上是segment多段组成,然后kafka为segment建立索引,索引文件是在磁盘里.index文件存储的
4)批量读写+批量压缩