1.kafka概述
什么是kafka?
kafka是一个消息系统,消息中间件,是一个高吞吐量的分布式发布订阅消息系统。
2.kafka角色介绍
broker:kafka集群包含一个或多个服务器,服务器即broker
topic:每条发布到kafka集群的消息都有一个类别,类别即topic
message:消息,由定长的消息头和变长的消息体组成
partition:partition是物理上的概念,每个topic包含一个或多个partition
producer:消息生产者,负责发布消息到kafka broker
consumer:每个consumer属于一个特定的consumer group。如果没有指定group name,则属于默认的group
consumer group:每一个消费者组,会选择一个broker作为协调者
3.kafka集群环境搭建:
集群主机规划
安装zookeeper集群
安装kafka集群
4.kafka生产者与消费者
生产者:
连接kafka集群地址
创建生产者主体
生产消息信息record
消费者:
配置地址信息
创建消费者主体
循环取消息
5.发送消息的三种方式:
同步阻塞发送
使用场景:发送消息不能出错,发送消息的顺序不能出错,不关心高吞吐量
异步发送(发送并忘记)
使用场景:发送消息不管会不会出错,发送消息错乱没有关系,只关心高吞吐量
异步发送(发送并回调)
使用场景:发送消息不能出错,但是我不关心消息的具体顺序
6.消息的存储和查询机制
topic:
每条发布到kafka集群的消息都有一个类别,该类别就是topic
partition:
partition是物理上的概念,每个topic包含一个或多个partition
每个分区由一系列有序的不可变的消息组成,是一个有序队列
每个分区在物理上是一个文件夹,分区命名规则:topicname-partitionId
分区目录下,存储该分区的日志段。包含一个数据文件和两个索引文件
每条消息被追加到对应的分区中,是顺序写磁盘。这也是kafka高吞吐量的重要保证
kafka是局部有序,即只保证一个分区内的消息顺序性,不保证全局有序
logSegment:
日志文件按照大小,或者时间滚动,切分成一个或者多个日志段(logSegment),日志段大小默认1gb
消息的查询:
根据文件存储的有序性,通过二分查找先找到文件,再找文件中具体的消息
7.三种数据发送策略
指定分区发送
不指定分区,没有key,轮询发送
不指定分区,有key,hash发送
8.消费者负载均衡策略
消费者与partition的对应关系:同一个分区的数据,只能被一个消费组中的一个消费者消费
9.Kafka如何保证消息的顺序性
问题:
比如说我们建了一个 topic,有三个 partition。生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。
消费者从 partition 中取出来数据的时候,也一定是有顺序的。到这里,顺序还是 ok 的,没有错乱。接着,我们在消费者里可能会搞多个线程来并发处理消息。因为如果消费者是单线程消费处理,而处理比较耗时的话,比如处理一条消息耗时几十 ms,那么 1 秒钟只能处理几十条消息,这吞吐量太低了。而多个线程并发跑的话,顺序可能就乱掉了。
解决方案:
- 一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
- 写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。