一、消息中间件
1、为什么使用消息中间件?
异步 |
解耦 |
削峰填谷 |
2、异步
3、解耦
异步处理使整个数据操作流程解耦,如果短信服务或者积分服务异常,不影响前面重要的功能。
面试问题点:
所以尽量将不重要的服务放到下游,且不要产生依赖关系,如果下游服务产生耦合,那么这里的异步操作将失去意义。
4、削峰填谷
双十一秒杀、春节12306场景有流量洪峰,但是后端服务器短时间内无法处理大量请求,使用消息中间件可以缓存涌入进来的大量请求,后端服务慢慢消费这些请求,尽最大努力处理请求。
也不用为了这些“偶然”场景去搭建更高性能的服务集群,节约成本。
5、开发解耦
使用MQ可以避免直接调用接口。
如果B还未提供接口,A也不必等着
二、Kafka安装与配置
1、下载
Apache Kafka
2、解压
上传到Linux虚拟机,我这里使用的是阿里云服务器。
3、使用zookeeper启动
进入kafka的bin目录,编写两个启动脚本,一个启动zookeeper,一个启动kafka。
# 启动zookeeper脚本
#!/bin/bash
source /root/kafka/kafka_2.13-3.8.0/bin/zookeeper-server-start.sh /root/kafka/kafka_2.13-3.8.0/config/zookeeper.properties &# 启动kafka脚本
#!/bin/bash
source /root/kafka/kafka_2.13-3.8.0/bin/kafka-server-start.sh /root/kafka/kafka_2.13-3.8.0/config/server.properties &
4、直接启动
1)获取kafka唯一标识
# 获取kafka唯一标识
sh kafka-storage.sh random-uuid
使用uuid方式启动kafka后,可以看到返回一个uuid,这个uuid是kafka集群中节点的唯一标识。
2)格式化存储目录
sh kafka-storage.sh format -t 25Z4D7QnRBKhQlw-VcDd8A -c ../config/kraft/server.properties
把相关的存储目录格式化,保存数据文件。
3)启动kafka
sh kafka-server-start.sh ../config/kraft/server.properties
三、kafka的命令
1、topic - 主题
kafka-topics.sh
# 创建主题
sh kafka-topics.sh --bootstrap-server localhost:9092 --create --topic allwe-topic --replication-factor 1 --partitions 8# 查询主题
sh kafka-topics.sh --bootstrap-server localhost:9092 --list# 查询主题明细
sh kafka-topics.sh --bootstrap-server localhost:9092 --describe
2、生产者
kafka-console-producer.sh
# 启动生产者 - 指定一个主题
sh kafka-console-producer.sh --broker-list localhost:9092 --topic allwe-topic
3、消费者
kafka-console-consumer.sh
# 启动消费者 - 指定一个主题
sh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic allwe-topic --from-beginning --consumer.config ../config/consumer.properties
四、kafka中的基本概念
1、主题和分区
主题:表示一类消息。
分区:认为是一个文件。可以理解为一个分区就是一个队列。
分区的意义:提高消费的并发程度。由于消费消息相对于生产消息很慢,可以增加分区去提高消费的并发度,从而平衡生产和消费的速度。
2、消息和批次
kafka内部只存储byte数组,消费者取消息时也只是取byte数组。
对于很大的数据,kafka会将这个大的数据分为多段小的数据,分批次发送。
3、生产者和消费者
生产者生产消息
消费者消费消息
4、偏移量、消费者群组
消费者根据偏移量确定上次消费到哪了,拿着偏移量继续消费。
当启动多个消费者时,可以组成一个消费者群组。
在群组消费者群组场景下,每个分区的消息只能由一个消费者消费,但是一个消费者可以消费多个分区的消息。这样做的目的是确保消息的顺序。
5、kafka中生产和消费流程
6、kafka硬件配置的选择
磁盘:非常依赖磁盘
吞吐量:存储消息的速度。
容量:堆积消息的能力,只有达到一定条件才会删除过时文件。
网络:比较依赖网络,网络的吞吐量对kafka集群的影响很大。
内存:影响消费速度,需要将数据从磁盘拿到内存中进行消费。建议单独部署。
CPU:依赖性不强
7、配置文件
server.properties
# 配置为正数。在集群场景下,如果出现网络ip变化,有了这个参数就不用担心
broker.id=0 # 配置kafka的端口号
listeners=PLAINTEXT://localhost:9092# 网络请求线程数
num.network.threads=3# 数据存储目录
log.dirs=/tmp/kafka-logs# 创建主题时,默认分区数
num.partitions=1# 在重启或启动时,加载数据的线程数,建议和cpu核数对应
num.recovery.threads.per.data.dir=1# 配置日志保存时间,默认是168小时,过期自动清理
log.retention.hours=168# 如果以zookeeper启动,指定zookeeper的ip+port
zookeeper.connect=localhost:2181