Kafka3.0学习—Kafka简介
一、Kafka简介
1.Kafka定义
Kafka是一个分布式的基于发布/订阅模式的消息队列。
2.发布/订阅
消息的发布者将消息发送到topic中,可以同时有多个消费者订阅这个topic的消息,所有订阅了该topic的消费者都可以消费这个topic里的数据。
3.点对点
消息的生产者将消息发送到消息队列queue中,然后消息接收者主动从消息队列中拉取数据并且消费消息。消息被消费后,消费者发送确认收到,消息队列删除该条消息。
4.点对点模式和发布/订阅模式的区别
点对点模式中:一个queue可以有多个消费者,但是一个消息只能被一个消费者消费一次,之后就会被删除。
发布/订阅模式中:一个topic可以有多个消费者,所有订阅了这个topic的都可以得到这个topic的消息拷贝。
5.Kafka应用场景
5.1 缓冲/削峰
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
比如在双十一,流量剧增,这相当于生产者生产速度飞快,但是消费者的消费速度却跟不上。为了解决这个问题,可以使用Kafka,Kafka可以根据消费者的消费速度给它相应的数据,其余的数据可以暂存到Kafka中。
5.2 解耦
因为数据的数据来源可以有很多,比如MySQL、Flume、或者Socket网络端口等等;数据的消费目的地也有很多,比如Hadoop、Spark Streaming、Flink、Springboot等等。如果一个数据源要发往多个目的地或者一个目的地要接受多个数据源的数据,直接掉方法是非常令人头疼的,可以将所有数据源的数据放到Kafka中,谁需要拿谁就去Kafka拿就可以了。
解耦前:
解耦后:
5.3 异步通信
比如用户注册场景:
通常情况下,会先调用注册模块,耗时30ms,用户注册模块在数据库写入数据后,再去调用发短信的业务接口,又花费了30ms,总共花费60ms
使用Kafka后,在调用注册模块将数据写入数据库后,直接返回注册成功,同时将发短信业务的消息放到Kafka中慢慢处理,因为毕竟写入到数据库后就可以登录了,发短信什么的无关紧要。
(或者是注册时需要验证码,一般情况下发送成功和我们真正收到消息是有一定时间差的,就是在收到注册请求后直接返回发送成功,然后将消息放到消息队列中,依次去发送)
6.Kafka基础架构
1)Producer
消息生产者,向Kafka中发送数据
2)Consumer
消息消费者,消费Kafka中的数据
3)Consumer Group(CG)
消费者组,由多个consumer组成。消费者组内可以有多个消费者,每个消费者负责消费不同的分区,一个分区只能被一个消费者组内的一个消费者消费;一个分区可以被多个消费者组消费;所有的消费者都属于某个消费者组。
4)Broker
一个broker就相当于一个Kafka集群中的一个节点,例如hadoop102、hadoop103、hadoop104就是三个broker
5)Topic
Kafka集群中是以topic分类不同的消息的。
6)Partition
可以理解为topic的分区,一个非常大的topic可以被切分为多个分区分布在多个节点上,每个partition中的数据都是有序的
7)Replicas
topic的副本。一个topic的每个分区都有若干个副本,多个副本之间分为一个Leader和多个Follower。
一个topic的多个分区位于多个节点上,每个分区和它的副本不在一个节点上(都是为了保障数据可靠性)
8)Leader
一个topic多个副本中的主,生产者发送消息和消费者消费消息都是针对于这个Leader副本的。
9)Follower
一个topic中多个副本中的从。它会实时的从Leader中同步数据,保持和leader数据的同步,Leader发生故障时,某个Follower会成为新的Leader。
二、Kafka简单命令行操作
1.Topic相关命令行操作
通过使用:bin/kafka-topics.sh
可以查看相关topic的命令行操作信息。
1.1 相关命令参数
参数 | 描述 |
---|---|
--bootstrap-server hadoop102:9092,hadoop103:9092 | 连接的 Kafka Broker 主机名称和端口号 |
--topic topic名称 | 操作的 topic 名称 |
--create | 创建主题 |
--delete | 删除主题 |
--alter | 修改主题 |
--list | 查看所有主题 |
--describle | 查看主题详细描述 |
--partitions 分区个数 | 设置分区数 |
--replication-factor 副本个数 | 设置分区副本 |
--config <String: name=value> | 更新系统默认的配置 |
1.2 命令参数使用
1)查看所有topic
bin/kafka-topics.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --list
2)创建topic
这里创建名称为first的topic,它的分区数为1,副本数为3
bin/kafka-topics.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --create --topic first --partitions 1 --replication-factor 3
注意:创建topic时必须要指定分区数和副本数
3)查看first主题的详情
bin/kafka-topics.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --describle --topic first
4)修改分区数
bin/kafka-topics.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --alter --topic first --partitions 3
注意:修改分区的时候,修改后的分区必须要大于原来的分区。原因很简单:因为如果分区修改小了,原来一个分区被一个消费者消费,现在两个分区合并到一块了,怎么判断这个分区由原来的两个消费者中的哪个消费者消费。
5)删除topic
bin/kafka-topics.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --delete --topic first
2.生产者相关命令行操作
生产者命令前面使用bin/kafka-console-producer.sh
2.1 相关命令参数
参数 | 描述 |
---|---|
--bootstrap-server hadoop102:9092,hadoop103:9092 | 连接的 Kafka Broker 主机名称和端口号 |
--topic topic名称 | 操作的topic名称 |
2.2 发送消息到Kafka
向first这个topic发送消息
bin/kafka-console-producer.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --topic first
3.消费者相关命令行操作
消费者命令前面使用bin/kafka-console-consumer.sh
3.1 相关命令参数
参数 | 描述 |
---|---|
--bootstrap-server hadoop102:9092,hadoop103:9092 | 连接的 Kafka Broker 主机名称和端口号 |
--topic topic名称 | 操作的topic名称 |
--from-beginning | 从头开始消费 |
--group <String: consumer group id> | 指定消费者组名称 |
3.2 消费Kafka里的数据
从最新的地方开始消费:
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --topic first
从开头开始消费:
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --from-beginning --topic first