文章目录
一、简介
Kafka
的标准定位是分布式流式处理平台。
Kafka
架构图,如下:
Kafka
处理思路:
- 生产者发送消息给
Kafka
服务器 - 消费者从
Kafka
服务器读取消息 Kafka
服务器依托Zookeeper
集群进行服务的协调管理
(1)消息
信息承载体:消息
消息的完整格式,如图:
- 消息主要三个字段:
Key
:消息键,对消息做partition
(分区)时使用,即决定消息被保存在某个topic
下的哪个partition
,可由用户自定义Value
:消息体,保存实际的消息数据Timestamp
: 消息发送时间戳,用于流式处理及其他依赖时间的处理语义。如果不指定,则取当前时间
- Tips:
Kafka
使用紧凑的二进制字节数组来保存消息。
// 例如:
public class Message {
private CRC32 crc; // 校验码
private short version; // 版本号
private boolean codecEnabled; //
private short codecClassOrdinal;
private String key; // 消息键
private String value; // 消息体
}
为什么
Kafka
要把消息体转化为字节数组?
JMM
对Java
类继续优化——重排字段,减少内存使用量,但可能其中 7字节只是为了补齐之用- 运行
Java
的操作系统通常都默认开启了页缓存机制,也就是说堆上保存的对象很有可能在页缓存中还保留一份,这造成了极大的资源浪费。
- 消息支持 4种 压缩类型:
- 0:无压缩
- 1:GZIP
- 2:Snappy
- 3:LZ4
(2)Topic
主题
如图:
Topic
用来区分实际业务。
topoc
可以被多个消费者订阅。
(3)Partition
分区
如图:
partition
是不可修改的有序消息序列,即有序的消息日志。
每个partition
有自己专属的partition
号,通常从 0 开始。
用户对partition
唯一能做的操作就是在消息序列的尾部追加写入消息。
partition
上的每条消息都会被分配一个唯一的序列号(offset
,位移)
目的:为了提升系统的吞吐量。(多线程)
(4)offset
位移
如图:
topic
下partition
下的每条消息都被分配一个位移值(offset
)
so,消息:<topic, partition, offset> 三元组(tuple)
通过该元组值可以在
kafka
集群中找到唯一对应的消息
(5)replica
副本
冗余机制。
replica
副本的目的:防止数据丢失。
replica
副本分为两类:
- 领导者副本(leader replica)
- 追随者副本(follower replica)
- follower replica:不给客户端提供服务,即不负责响应客户端发来的消息写入和消息消费请求。
- 只被动地向领导者副本(leader replica)获取数据
- 作为备份,一旦 leader replica 所在的
broker
宕机,将从 follower replica 选举出新的 leader 继续提供服务。
如图:
(6)ISR
(in-sync replica,保持同步的 replica 集合)
ISR
: 保持同步的replica
集合
Kafka
的消息交付承诺(message delivery semantic):
Kafka
对于没有提交成功的消息不做任何交付保证,它只保证在ISR
存活的情况下 “已提交” 的消息不会丢失。
(7)Broker
Broker
通常是以服务器的形式出现,作为 “代理人”。
主要功能:持久化消息以及将消息队列中的消息从发送端传输到消费端。
Kafka
的Broker
负责持久化producer
端发送的消息,同时还为consumer
端提供消息
(8)Producer
生产者
producer
就是负责向Kafka
写入数据的应用程序。
(9)Consumer
消费者
consumer
是从Kafka
读取数据的应用。
若干个 consumer
订阅 Kafka
集群中的若干个topic
并从Kafka
接收属于这些topic
的消息
(10)Consumer Group
消费者组
消费者使用一个消费者组名(group.id)来标记自己,topic
的每条消息都只会被发送到每个订阅它的消费者组的一个消费者实例上。
- 一个
consumer group
可能有若干个consumer
实例 - 对于同一个
group
而言,topic
的每条消息只能被发送到group
下的一个consumer
实例上。 topic
消息可以被发送到多个group
中