1.先导知识:
2.消息队列的应用场景
-
异步处理
-
为什么要使用消息队列?
- 比较耗时的操作放在其他系统中,通过消息队列将需要处理的消息进行存储,其他系统可以消费消息队列中的数据
-
案例: 用户注册,后端一方面需要保存用户信息;另一方面需要发送短信,发送邮箱等需要连接第三方服务,需要额外等待一段时间
-
常见的异步处理:
- 下载报表
-
-
系统解耦
-
为什么要使用消息队列?
- 原先一个微服务调用接口去调用另一个微服务,耦合比较严重,只要接口发生变化就会导致系统不可用。使用消息队列可以进行解耦,第一个微服务可以将消息放入到消息队列,另外一个微服务去处理。
- 案例:系统之间的依赖即耦合度
-
-
流量削峰
-
为什么要使用消息队列?
-
- 因为消息队列是低延迟,高可靠,高吞吐,可以应对大量并发。先接收大量用户的请求放到消息队列,再使用业务处理程序进行处理。
-
-
日志处理
-
为什么要使用消息队列?
- 临时存储大量用户信息
- 案例: 记录分析用户行为,手机大量的用户访问信息
-
3.生产者,消费者模型
-
1.点对点模式
-
步骤:
- 消息生产者发送消息-> MQ
- 消费者从MQ取出并消费
- MQ删除消息,不再存储
-
特点:
- 单个消息只有一个消费者
- 生产者和消费者之间无依赖性。生产者发送消息之后,不管消费者是否在允许,都不影响发送者下次发送消息
- 消费者消费之后需要向MQ应答,方便队列删除消息
-
2.发布订阅模式
-
步骤:
- 单个消息可以有多个订阅者
- 发布者和订阅者之间有时间依赖性。针对某个topic的订阅者,它必须创建一个订阅者之后,才能消费消息。
- 订阅者需要提前订阅该topic,并保持在线运行
4.Kafka
-
是什么?
-
为什么用Kafka?
- 支持生产者,消费者模型
- 单机吞吐量是十万级
- 消息延迟是毫秒级
- 分布式可用型性高
- 消息理论不会丢失
- 支持事务
-
应用场景:
- 建立实时数据管道,在系统/应用程序之间获取数据。
- 构建实时流应用程序,转换/响应数据流
-
KafkaTool 图形界面工具
- 是一个用于管理和监控 Apache Kafka 集群的图形界面工具
- 官方网站: Offset Explorer
-
基本操作
- 创建主题topic(实际工作中给开发要topic)类似Mysql的表
- 生产者生产消息(以key,value键值对)到Kafka的topic中
- 从Kafka topic取消息进行消费
- 一个消费组中包含多个消费者,可以共同消费topic中的数据
- 一个分区只能被一个消费者消费
-
Kafka幂等性
-
Kafkas生产者的分区写入策略
-
轮询分区(默认)
- 触发条件: 生产消息时key为null
-
-
按key分区
-
- 触发条件: 生产消息时有key会根据分区数 按模运算
-
-
自定义分区
-
写入策略会存在乱序问题:
- 生产者是有写入策略,如果topic有多个分区,就会根据策略分配到不同partiton中存储,全局是乱序的;如果topic只有一个分区,消息是有序的。
-
-
Kafka消费者的分区分配策略:
-
Range范围分配策略(默认)
-
按照topic维度,确保每个消费者消费的分区数量是均衡的
-
-
-
-
-
5.如何测试消息队列?
https://blog.csdn.net/weixin_46697247/article/details/144804334