MQ高级
2024-12-25 16:13:49 0 举报
AI智能生成
"MQ高级是一种功能强大的消息队列系统,为企业级应用提供了高效、可靠的消息传输和接收服务。它支持多种编程语言和协议,具有高可用性、高扩展性以及安全性等特点。用户可以利用MQ高级来实现异步通信、负载均衡、流量削峰等应用场景,提高系统的性能和稳定性。"
作者其他创作
大纲/内容
消息可靠性
生产者
publisher confirm
检测 生产者 到 交换机 这个环节
成功发送到交换机,返回ack
没有发送到交换机,返回nack
publisher return
检测 交换机 到 队列
成功发送到队列,没有ack
没有发送到队列,有ack
api使用
用回调来进行消息确认
开启回调:修改配置
有几个callback
confirm callback
可以有多个callback
每次发送消息,可以绑定不同的callback
RabbitTemplate.convertAndSend("交换机名称","路由key","消息", corrolaote)
放了消息的唯一id
绑定了callback
成功
收到ack
不需要处理
收到nack
需要处理
记录日志
重发
通知工作人员处理
失败
出现了异常
return callback
只能有一个
整个RabbitTemplate只能有一个returnCallback
applicationContextAware接口
通知接口
当applicationContext加载完成之后
applicationContext---beanFactory
beanFactory把RabbitTemplate给取出来
给它设置一个callback
什么情况下,消息才成功的投递到了MQ?
收到了publiser confirm的ack
没有收到bublisher return的ack
MQ
数据存储在队列里面
队列存储在内存里面
持久化
交换机
队列
消息
高可用
SpringAMQP默认都是持久化的
消费者
消息确认机制
手动
自动
none
消息nack
MQ马上会重新投递消息
其实对MQ服务端的压力很大
会影响MQ的正常逻辑
开启消息重试机制
本地重试
初始时间
失败之后,第一次重试的间隔时间
时间倍数
后面继续重试时,递增的时间间隔
最大重试次数
不进行无休止的重试,达到次数就结束了
默认进行丢弃
换个地方存起来
三种重试失败的策略
1、默认丢弃
2、重新入队
3、Republisher
发送给另外一个交换机,由它负责路由,存储起来
声明另外一套交换机、队列、绑定
@Bean MessageRecoverer 对象
最大等待时间
重试的最大间隔
prefetch
消息预取
延迟消息
死信
死掉的信息
1、nack了,但是没有配置重新入队
2、超时了
3、满了,前面的就死了
给队列绑定了死信交换机
dead-letter-exchange
绑定了死信交换机
dead-letter-routingkey
绑定路由key
死信交换机
处理死信的交换机
队列
延迟消息
发出去的消息不立即进行消费
而是经过一段时间之后才被消费
ttl+死信交换机
1、交换机+队列
消息设置ttl
setExpired(1000)
队列设置ttl
ttl(1000)
两者都有的话,以小值优先生效
绑定死信交换机
dead-letter-exchange
绑定了死信交换机
dead-letter-routingkey
绑定路由key
2、交换机+队列
声明交换机
声明队列
延迟队列
插件:延迟交换机
交换机暂存了消息
投递给队列
声明交换机
设置一个delayed属性
发送消息的时候
setHeader("x-delay",1000)
消息堆积
原因
消息的消费速度跟不上生产速度
解决方案
增加消费者数量
消费者开多线程
加大队列的容量
缓解
惰性队列
lazy()
优点
存储在磁盘,上限高
没有频繁pageout的情况
缺点
存储在磁盘,所以速度慢
集群
普通集群
只有声明的那个节点才会存储队列的所有数据
其他节点只存储队列的元信息
因此只要声明的那个节点down掉了,整个队列就处于不可用状态
镜像集群
就是在普通集群基础上加主从架构
当主节点挂掉之后,会从从节点当中挑选新的主节点
并且会把队列数据迁移到正常的机器上
可能存在的问题
主节点和从节点进行数据同步的时候,可能会发生数据丢失
仲裁队列
>=3.8版本
引入了raft协议来进行主从同步
这个协议是强一致性的,因此保证主从节点数据的一致性
Java怎么连接集群
单节点的时候
ip
port
集群的时候
address
ip:port,ip:port
消息顺序性
一个队列一个消费者
消费能力跟不上
多个队列,每个队列一个消费
复杂性高
一个队列一个消费者
消费者把数据散列分散开来
消费者把数据散列分散开来
内存队列
程序宕机了,数据就丢失了
......
消息幂等性
排重
每处理完一个消息,就把这个消息的id放到redis
处理的时候先判断id在redis是否存在
存在,意味着处理过了,不再处理
不存在,进行处理
业务层面
处理状态
0 条评论
下一页