RabbitMQ的原理和使用场景可靠性分析springboot整合

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 集群节点类型
磁盘节点,内存节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值