第一章 认识Apache Kafka
1 消息引擎系统
kafka支持以下两种消息模型
1.1 消息队列
特点如下:
- 基于队列提供消息传输服务
- 该模型定义了
queue
,sender
,receiver
- 提供了一种点对点的消息传递方式,即发送者发送每条消息到队列的指定位置,接受者从指定位置获取消息
一旦消息被consumed,就会从队列中移除该消息,每条消息由一个发送者生产出来,只能被一个消费者处理 - 发送者和消费者是一对一的关系
1.2 发布/订阅
- 有主题(topic)的概念
- 发布者将消息放到指定的topic中,所有订阅了该topic的订阅者都能接收到消息
- 发布者(publisher)/订阅者(subscriber)多对多关系
2 Kafka如果做到高吞吐,低延时
2.1生产端
Kafka每次写操作是把数据写入到操作系统的页缓存(page cache),然后由操作系统自行决定什么时候把
页缓存中的数据写回到磁盘上。
这样写的优势如下:
- 操作系统的页缓存是在内存中分配的,所以消息写入的速度非常快。
- Kafka不必直接与底层文件系统打交道,所有的I/O操作都交给操作系统来处理。
- Kafka写入操作采用追加(append)的方式,避免了磁盘随机写操作。
2.2消费端
- Kafka读取消息的时候会首先尝试从OS的页缓存中读取,如果命中,直接把页缓存发送到网络的Socket上。
这个过程是利用Linux平台上的sendfile系统调用做到的,这种技术就是零拷贝技术。 - Kafka 由于大量使用页缓存,故读取消息时大部分消息都很有可能还在页缓存中,可以直接命中缓存。
(命中率高)
3.Kafka基本概念与术语
-
topic(主题) :代表了一类消息,也可以认为是消息被发送到的地方
-
partition(分区):每个topic由多个partition组成。每个topic都有一个专属的partition号。通常是从0开始的,用户对partition唯一能做的就是在消息序列的尾部追加写入消息。partiton上的每条消息都会被分配唯一一个的序列号,partition没有太多的实际业务含义,引入为了分散负载,提高整体性能的最大化。
-
oddest : partition下的每条消息都会被分配一个位移值。(消息写入的位移值)
-
leader/follower 只有leader对提供服务,follower只是被动的追随leader的状态,保持与leader的同步。follwer存在的位移价值就是充当leader的候补,一旦leader挂掉就会又一个follower被选举成为一个新的leader。
-
replica(副本) : kafka的备份日志, 它们的存在的目的是防止数据丢失,replica分为两类:
leader relica 和 follwer replica,follower replica只是被动的向leader replica获取数据。 -
broker : kafka服务器
-
ISR : in-sync replica 与leader保持同步 的replica集合 。kafka为partition动态维护一个replica集合,只有在这个集合中的replica才能被选举为leade,只有这个集合中的所有replica都收到了同一条消息Kafka才会将这个消息置于“已提交”状态,即认为这条消息发送成功,为什么要由ISR:部分foller跟不上leader的节奏。当滞后一定的程度,kafka会把这些replica踢出ISR。当这些replica重新跟上leader进度又回加入到ISR中。
参考
《Apache Kafka 实战》胡夕