1.1 kafka快速入门
kafka的核心功能是高性能的消息发送和高性能的消息消费。
1.2 kafka安装
windows下安装:
下载地址:http://kafka.apache.org/quickstart#quickstart_download
windows下启动:
先解压安装包,进入bin/windows文件夹。
启动kafka:
zookeeper-server-start.bat ../../config/zookeeper.properties
kafka-server-start.bat ../../config/server.properties
1.3 创建topic
创建主题用于消息的发送与接收。
创建主题:
kafka-topics.bat --create --zookeeper localhost:2181 --topic test --partitions 1 --replication-factor 1
查看主题状态:
kafka-topics.bat --describe --zookeeper localhost:2181 --topic test
1.3 发送消息
kafka-console-producer.bat --broker-list localhost:9092 --topic test
1.4 消费消息
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
2 消息引擎系统
2.1 消息设计
消息要完整清晰表达业务的能力,通常采用结构化的方式设计。
2.2 传输协议设计
常见的有AMQP,WebService+Soap和微软MSMQ。Kafka自行设计了二进制的消息传输协议。
2.3 消息引擎范型
常见的消息引擎范型有消息队列模型和发布/订阅模型。
消息队列是基于队列提供消息传输服务的,多用于进程间通信以及线程间通信。该模型定义了消息队列、发送者和接收者,提供了一种点对点的消息传递方式,即发送者发送每条消息到队列的指定位置,接收者从指定位置接收消息。一旦消息被消费,就会从队列中移除该消息。每条消息由发送者生产出来,只能由一个消费者消费。发送者与消费者是一对一的关系。
发布/订阅模型与消息队列不同,它也有发布者和订阅者,发布者将消息生产出来发到指定topic中,所有订阅了该topic的订阅者都可以接收到该topic下的所有消息。
kafka支持两种模型。
2.4 java消息服务
JMS即java消息服务,提供了很多接口用于实现分布式系统间的消息传递。
3 kafka概要设计
kafka设计是为了解决互联网公司超大量级数据的实时传输。
面临的问题:
- 吞吐量/延时
- 消息持久化
- 负载均衡和故障转移
- 伸缩性
3.1 吞吐量/延时
吞吐量表示每秒能处理的消息数量或者每秒能处理的字节数。
延时:它是衡量一段时间间隔,可能是发出某个操作与接收到操作响应之间的时间。或者在系统中导致某些物理变更的起始时刻与变更正式生效时刻之间的间隔。
kafka中的时延表示客户端发起请求与服务器处理请求并发送响应数据给客户端之间的一段时间。
kafka能够实现高吞吐量、低延时得益于它对磁盘的使用方法:
kafka虽然也会把数据写入磁盘,但是它先将数据写入OS页缓存(页缓存有内存分配),在由页缓存写入磁盘。
这样的优势:
- 缓存在内存中分配,写入快;
- kafka不直接与底层文件系统交互,所有I/O是交由OS处理。
- 写入时采用追加写入,避免磁盘随机读写,磁盘的顺序读写速度较快。
上面介绍了kafka生产端做到的高吞吐、低延时,那么kafka消费端如何实现高吞吐、低延时?
kafka首先会从页缓存中读取,如果命中,把消息经页缓存直接发送网络上的Socket。这个过程是利用linux平台的sendfile系统调用做到,这就是零拷贝技术。
零拷贝:在内核驱动程序处理I/O数据时,它不需要进行上下文切换,节省了内核缓冲区与用户态应用程序缓冲区之间的数据拷贝,同时它利用直接存储器访问技术执行I/O操作,避免了OS内核缓冲区之间的拷贝。
kafka依赖一下4点实现高吞吐、低延时:
- 大量使用OS页缓存,内存操作速度快且命中率高;
- 不直接参与物理I/O,有OS实现;
- 采用追加写,顺序读写快,放弃随机读写;
- 使用以sendfile零拷贝技术加强网络传输。
3.2 消息持久化(高可靠实现)
把消息持久化到磁盘,这样做有一下好处:
- 解耦消息发送与消息消费;
- 实现灵活消息处理。
3.3 负载均衡与故障存储
通过zookeeper实现,各个服务器都与zookeeper建立会话机制,zookeeper会定期检测心跳以及各个服务器的负载信息,从而实现负载均衡和故障存储。
3.4 伸缩性
它表明了分布式系统中增加额外计算资源时候吞吐量提升的能力。
4 kafka基本概念
kafka是一个分布式流式处理平台。
kakfa架构
4.1 消息
消息格式由很多字段构成,下面是消息的大致字段构成:
消息由头部、key和value组成。
- key:消息键,对消息做partition使用,即决定消息被保存在某topic下哪个partition;
- value:消息体,保存实际消息数据;
- timestamp:消息发送时间戳,用于流式处理及其他依赖时间处理语义。
kafka使用二进制字节数组保存消息,最大节省传输消耗。
4.2 topic和partition
kafka中topic被多个消费者订阅。
其结构为:topic--------------partition---------message
4.3 replica日志备份
备份分为领导者副本和追随者副本,只有领导者副本提供服务。
kafka会保证同一个partition的多个replica一定不会分布在同一台服务器上。
4.4 ISR(与leader replica保持同步的replica集合)
kafka为partition动态维护一个replication集合,该集合中所有replica保存的消息日志都与leader replica保持同步状态,只有这个集合中的replica才能被选为leader,也只有这个集合中所有replica都接收到了同一条消息,kafka才会将该消息置于已提交状态,即认为这条消息发送成功。
kafka保证已提交消息不丢失需要ISR至少有一个活着的replica,对于未提交成功消息不做保证。其次,当某些replica落后于leader时,滞后一定程度的replica会被踢出ISR,后期重新追上leader的会重新加入ISR。
4.5 kafka使用场景
- 消息传输
- 网站行为跟踪
- 审计数据收集
- 日志收集
- EVENT Sourcing
- 流式处理
4.6 kafka设计的特性
- 为生产者和消费者提供了一套简单的API;
- 降低网络传输和磁盘存储开销;
- 具有高伸缩性架构。
4.7 kafka的版本变迁
版本 | 功能 |
0.7 | 消息引擎服务 |
0.8 | 增加集群间备份机制 |
0.8.2.x | 使用java重写producer |
0.9.0.x | 增加了kafka安全性设置,使用java重写了consumer,增加了kafka connect组件 |
0.10.0.x | 增加kafka streams组件 |
0.11.0.x | 增加了对事务的支持以及实现了精确一次处理语义 |
1.0 | 优化了kafka Streams API以及各种监控指标的完善 |