kakfka工作原理

  • 目录
  • 重要概念
  • 工作模式图
  • ack三种机制
  • 如何避免重复消费(如何保证消息的幂等性)
  • 如何确保消息不丢
  • 如何确保消息顺序消费
  • Kafka吞吐量为什么如此高


目录

个人原创总结之 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

工作模式图

kafka heart机制 kafka partion 原理_kafka

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)批量读写+批量压缩