Kafka 分布式的情况下,如何保证消息的顺序?
同一个 Partition 用一个 write ahead log 组织,所以可以保证 FIFO 的顺序。
不同 Partition 之间不能保证顺序。但是绝大多数用户都可以通过 message key 来定义,因为同一个
key 的 message 可以保证只发送到同一个 Partition。比如说 key 是 user id,table row id 等等,所以同
一个 user 或者同一个 record 的消息永远只会发送到同一个 Partition上,保证了同一个 user 或 record
的顺序。
Kafka 的设计思路
1)Kafka 将消息以 topic 为单位进行归纳
2)将向 Kafka topic 发布消息的程序成为 producers.
3)将预订 topics 并消费消息的程序成为 consumer.
4)Kafka 以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 broker.
5)producers 通过网络将消息发送到 Kafka 集群,集群向消费者提供消息
数据传输的事务定义通常有以下三种级别
1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输
2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输
一次,这是大家所期望的
Kafka 判断一个节点是否还活着有那两个条件?
1)节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连接
2)如果节点是个 follower,他必须能及时的同步 leader 的写操作,延时不能太久
producer 是否直接将数据发送到 broker 的 leader(主节点)?
producer 直接将数据发送到 broker 的 leader(主节点),不需要在多个节点进行分发,为了帮助
producer 做到这点,所有的 Kafka 节点都可以及时的告知:哪些节点是活动的,目标topic 目标分区的
leader 在哪。
Kafa consumer 是否可以消费指定分区消息?
Kafa consumer 消费消息时,向 broker 发出"fetch"请求去消费特定分区的消息,consumer指定消
息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer 拥有了 offset 的控制
权,可以向后回滚去重新消费之前的消息,这是很有意义的
Kafka 消息是采用 Pull 模式,还是 Push 模式?
pull 方式,考虑下游消费者消费水品的能力
Kafka 存储在硬盘上的消息格式是什么?
消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32校验码。
消息长度: 4 bytes (value: 1+4+n)
本号: 1 byte
RC 校验码: 4 bytes
具体的消息: n bytes
Kafka 高效文件存储设计特点:
1).Kafka 把 topic 中一个 parition 大文件分成多个小文件段,通过多个小文件段,就容易定期清除或
删除已经消费完文件,减少磁盘占用。
2).通过索引信息可以快速定位 message 和确定 response 的最大大小。
3).通过 index 元数据全部映射到 memory,可以避免 segment file 的 IO 磁盘操作。
4).通过索引文件稀疏存储,可以大幅降低 index 文件元数据占用空间大小。
Kafka 与传统消息系统之间有三个关键区别
1).Kafka 持久化日志,这些日志可以被重复读取和无限期保留
2).Kafka 是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据 提升容错能
力和高可用性
3).Kafka 支持实时的流式处理
kafka 的 ack 机制
request.required.acks 有三个值 0 1 -1
0:生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱当 server 挂掉的时候就会丢数据
1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 但是如果 leader 挂掉后他不确保
否复制完成新 leader 也会导致数据丢失
-1:同样在 1 的基础上 服务端会等所有的 follower 的副本受到数据后才会受到 leader 发出的 ack,这样数据不会丢失
Kafka 的消费者如何消费数据
消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置等到下次消费
时,他会接着上次位置继续消费
消费者负载均衡策略
一个消费者组中的一个分片对应一个消费者成员,他能保证每个消费者成员都能访问,如果组中成
员太多会有空闲的成员
数据有序
一个消费者组里它的内部是有序的
消费者组与消费者组之间是无序的
kafka 生产数据时数据的分组策略
生产者决定数据产生到集群的哪个 partition 中每一条消息都是以(key,value)格式
Key 是由生产者发送数据传入所以生产者(key)决定了数据产生到集群的哪个 partition