1应用场景
1 跨系统的异步
2 同步变异步 (秒杀)
3 pub/sub事件驱动 同步数据,定时任务解耦,通知任务
4 实现事务一致性
2特性
1 可靠 2 消息集群 3 高可用4 多语言
3工作模型
生产者 —msg—> 交换机(exchange)-------->队列 ----------->连接 connection -------->消费者
交换机种类
1直连交换机 (明确关键字)一对一
2 主题交换机
一对多
通配符匹配连接队列 *代表一个单词 #零或多个单词
3 广播
4 知识点
消息无人消费怎么办
1)TTL 设置队列的存活时间
2)变成死信队列
哪些消息会变为死信
1)消息过期
2)未应答
3)队列达到最大长度 (先入队的会删除)
----------->到达死信交换机 死信队列 再次消费
优先消费
设置队列属性 优先级(高的先消费)
延迟队列
rabbitmq本身不支持
1 延迟队列插件
2 TTL+死信构成延迟队列
MQ流量控制
1服务端 flow control 策略
2 消费端 队列分发时 设置队列当前未处理完,不在分发
x-max-length 队列长度
1 消息堆积时才有用,不然直接消费了
2 先进入队列的消息会被删除
6 springboot整合rabbitMQ
消费者:
配置类: 定义交换机类型(direct,topix,fanout),定义队列(Queue),绑定交换机和队列
消费监听者:监听队列 类上加@RabbitListener(queue=“队列名”)
消费的方法上加@RabbitHandler
生产者
RabbitTemplate
发送消息 key+队列名
7 可靠性投递分析
producer ----1---->交换机-----2----->队列(3)----4---->consumer
1 确保消息发送到mq服务器
1)事务模式,消息事务 channel开启事务,(阻塞,不建议使用)
2)确认模式:channel设置为confirm模式,确认服务器返回成功
2 确保消息路由到正确的队列(生产上很少发生,会确保key,队列名正确)
1)ReturnListener 未路由到队列,会重新拿到消息发送
2)备份交换机
3 确保消息存储到队列上(服务断了消息还在)
队列持久化
交换机持久化
消息持久化
4 消费者确认
自动ack模式下,消费者拿到消息后队列才删除消息
手动ack 可以设置未业务处理成功后才删除消息
手工应答
5 其他
1)消费者回调
1)提供一个回调的api
2)消费者可以发送消息
2)补偿机制
重发消息
3)消息幂等性
4)消息顺序性
一个队列只有一个消费者才能保证顺序
8高可用架构
1集群
1)通信基础
erlang.cookie, hosts文件(加入集群)
2)磁盘节点 内存节点
消息分别存储到磁盘和内存,只有一个节点存到磁盘
3)配置步骤
配置hosts
同步erlang
加入集群,join cluster
2 镜像队列数据同步
不同MQ队列数据不能复制,实现数据复制
3 HAProxy负载
请求—keepalived—负载--------MQ节点
9实际问题
1 命名规范
队列名 xxx_QUEUE
交换机名 xxx_EXCHANGE
2 调用封装
template发送消息封装
3 信息落库 +定时任务
根据业务决定是否将消息保存表,消息可追溯,可重发
4 减少连接数
5 生产者先登记业务,再发送消息
6 由消费者创建对象,谁使用谁创建资源
10面试题
1 消息队列的作用和使用场景
异步通知,系统解耦,秒杀流量削峰
使用场景:新增接口,在mq中加入消息,异步通知其他业务模块,
支付模块和钱包模块,钱包支付完成回调通过mq通知
秒杀业务,控制活动人数
2创建队列和交换机的方法
new Queue
队列分为直连,主题,群发,创建不同队列,绑定key
new Exchange
3 多个消费者监听一个生产者是,消息怎么分发
直连,主题,群发
轮询,
公平分发;消费者有多消息没有给服务器应答ack时,队列就不会给这个消费者分发消息
4消息在什么情况下会变为死信
消息到达死信交换机
消息过期(队列过期,消息过期),无人应答,队列到达长度(最先达到的进入死信交换机)
5如何实现延迟队列
设置消息过期时间+死信队列,消息过期后加入死信队列在分发
6无法被路由的消息去了哪里
删除了
如果生产者配置了ReturnListener,消息返回生产者,会被生产者监听
7如何保证消息的可靠性
保证发送到mq服务器,确认模式
保证发送到正确的队列,队列名,key一致
保证队列保存消息持久化
保证消费者接受到消息 ack应答到生产者
补偿机制,没成功就重发
8如何在服务端和消费端限流
服务端 磁盘内存限流
消费端
9消息顺序性
一个队列一个消费者
全局id msgID parentMsgId
10 集群节点类型
磁盘节点,内存节点