消息队列应用场景:
- 应用解耦
例:数据归档,单据分很多个阶段处理,每个阶段都会进行归档,标记处理等调用其他服务,统一使用消息队列处理 - 流量削峰
例:消息队列中消息数量超过最大数量则拒绝请求或跳转到错误页面 - 异步处理
例:对大量第三方单据进行校验,采用消息队列,分批处理的方式,返回一个软状态处理中,每处理完一批则更新状态 - 消息通讯
例:不同厂商进行消息同步
RabbitMQ组成
- 角色: 生产者,服务端,消费者
- 交换机: 生产者生产的消息经过交换机分发给不同的队列
- 队列: 存储消息,消费者可指定不同的队列,拉取消息
- Routingkey: 交换机进行消息分发时指定规则
交换机类型:
- direct:类似单播,使用routingkey指定目的队列
- topic: 类似组播,将消息传递给下面同一主题的队列
- fanout:类似广播模式,将消息分发给每个下游队列
- header:忽略掉routingkey,使用hash数据结构来进行匹配和转发
常见问题
如何防止消息丢失?
生产者 问题:生产端——Server端,消息丢失 解决:Confirm确认,消息未确认会重新发送
服务端 问题:服务端挂掉导致消息丢失 解决:服务端消息备份,持久化到数据库
消费端 问题:服务端——消费端,消息丢失 解决:ACK应答,开启手动应答,应答后消息再从消息队列移除
如何保证消息幂等?
- 状态递进,状态向前变化,说明已经执行过了,不允许执行
- 数据库唯一键,保证不会重复插入
- redis的setnx已存在不允许插入
- 具体还是要看业务场景,万变不离其宗,只要你想到办法可以识别消息消费过那就可以解决问题
如何实现死信队列?
设置ttl + 死信交换机 + 死信队列
详见另一篇博文: https://blog.csdn.net/qq_44845473/article/details/126968773
版权声明:本文为qq_44845473原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。