一、Kafka是什么?
Kafka是一个分布式消息中间件,支持分区的、多副本的、多订阅者的、基于zookeeper协调的分布式消息系统。
通俗来说: kafka就是一个存储系统,存储的数据形式为“消息”;
它的主要作用类似于蓄水池,起到一个缓冲作用;
二、为什么拥有解耦、异步、削峰?
(1)解耦
传统模式:
传统模式的缺点:
- 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
中间件模式:
中间件模式的的优点:
- 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
(2)异步
传统模式:
传统模式的缺点:
- 一些非必要的业务逻辑以同步的方式运行,太耗费时间。
中间件模式:
中间件模式的的优点:
- 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
(3)削峰
传统模式
传统模式的缺点:
- 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
中间件模式:
中间件模式的的优点:
- 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。
三、Kafka中有哪些角色?
1、
p
roducer
消息生产者,就是向kafka broker 发消息的客户端。
2、
consumer
consumer :消息消费者,从kafka broker 取消息的客户端。
consumer group:单个或多个consumer可以组成一个consumer group;这是 kafka 用来实现消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个Consumer Group。
3、t
opic
数据的逻辑分类;可以理解为数据库中“表”的概念;
(1)partition:topic中数据的具体管理单元;(可以理解为hbase中表的“region”概念)
一个topic 可以划分为多个partition,分布到多个 broker上管理;
每个partition由一个kafka broker服务器管理;
partition 中的每条消息都会被分配一个递增的id(offset);
每个 partition 是一个有序的队列,kafka 只保证按一个 partition 中的消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。
每个partition都可以有多个副本;
分区对于 kafka 集群的好处是:实现topic数据的负载均衡。分区对于消费者来说,可以提高并发度,提高效率。
(2)broker
一台 kafka 服务器就是一个 broker。
一个kafka集群由多个 broker 组成。
一个 broker 可以容纳多个 topic的多个partition。
(3)offset
消息在底层存储中的索引位置,kafka底层的存储文件就是以文件中第一条消息的offset来命名的,通过offset可以快速定位到消息的具体存储位置;
4、
Leader
partition replica中的一个角色,producer和consumer只跟leader交互(
负责读写
)。
5、
副本Replica
partition的副本,保障partition的高可用(replica副本数目不能大于kafka broker节点的数目,否则报错。)
每个partition的所有副本中,必包括一个leader副本,其他的就是follower副本
6、
Follower
partition replica中的一个角色,从leader中拉取复制数据(
只负责备份
)。
如果leader所在节点宕机,follower中会选举出新的leader;
7、
偏移量Offset
每一条数据都有一个offset,是数据在该partition中的唯一标识(其实就是消息的索引号)。
各个consumer会保存其消费到的offset位置,这样下次可以从该offset位置开始继续消费;
consumer的消费offset保存在一个专门的topic(__consumer_offsets)中;(0.10.x版本以前是保存在zk中)
8、
消息Message
在客户端编程代码中,消息的类叫做 ProducerRecord; ConsumerRecord;
简单来说,kafka中的每个massage由一对key-value构成
各个字段的含义介绍如下:
- crc:占用4个字节,主要用于校验消息的内容;
- magic:这个占用1个字节,主要用于标识 Kafka 版本。Kafka 0.10.x magic默认值为1
- attributes:占用1个字节,这里面存储了消息压缩使用的编码以及Timestamp类型。目前Kafka 支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是 0001 则表示 gzip 压缩,如果是 0010 则是 snappy 压缩,如果是 0011 则是 lz4 压缩,如果是0000则表示没有使用压缩。第4个bit位如果为0,代表使用create time;如果为1代表append time;其余位(第5~8位)保留;
- key length:占用4个字节。主要标识 Key的内容的长度;
- key:占用 N个字节,存储的是 key 的具体内容;
- value length:占用4个字节。主要标识 value 的内容的长度;
-
value:
value即是消息的真实内容
,在 Kafka 中这个也叫做payload。