1、MQ如何避免消息堆积,使MQ提高消费者的速度?
提高消费者速率(集群)、消费者批量获取消息。
2、MQ如何避免消费者重复消费(幂等问题)
基于Redis的setNx命令。
基于数据库表字段的唯一性约束。
3、MQ服务器宕机之后,如何保证消息不丢失?
持久化机制
4、MQ接收到生产者投递消息,如果消费者不在的情况下,该消息是否会丢失?
不会,消息确认机制。必须要消费者成功消费消息,再通知给MQ服务器端删除该消息。当消息在指定时间内,没有被消费掉,会将消息转移到死信交换机分发给死信队列,给死信消费者进行消费。
5、MQ如何保证消息顺序一致性?
绑定同一个消费者和队列
6、MQ推与取架构模型
MQ 服务器与消费者建立长连接后,MQ 服务器会主动推数据给到消费者
当消费者第一次启动的时候,会主动找MQ 服务器拉数据
7、MQ如何实现高并发思想?
MQ消费者根据自身能力情况 ,拉取mq服务器端消息消费。默认的情况下是取出一条消息,可根据能力设置一次获取的消息数量。
8、MQ死信队列原理?
8.1 死信队列产生的背景
1)消息投递到MQ中存放的消息已经过期 ,消费者没有及时的消费消息,即消息存放到MQ服务器中过期,会转移到(备胎)死信队列存放。
2)队列达到最大的长度 (队列容器已经满了),会转移到备胎死信队列存放。
3)消费者消费多次消息失败,就会转移存放到死信队列中。
8.2 死信队列的架构原理
死信队列和普通队列区别不是很大,都有自己独立的交换机和路由key、队列和消费者。
1)生产者投递消息先投递到我们普通交换机中,普通交换机在将该消息投到普通队列中缓存起来,普通队列对应有自己独立普通消费者。
2)如果生产者投递消息到普通队列中时,出现8.1中的几种情况,会将该消息转移到死信(备胎)交换机中,死信(备胎)交换机将消息分发给对应的死信(备胎)队列,再由对应的死信(备胎)消费者进行消费。
8.3 RabbitMQ应用场景
基于RabbitMQ设计订单30分钟超时处理
基于死信队列。消息生产者发送消息时,设置消息有效时间为30分钟,如果30分钟内消息没有被消费,消息将被转移到死信交换机,分发给死信队列,死信消费者对消息进行消费。
8.4 实现方式
1)配置文件application.yml
spring:
rabbitmq:
####连接地址
host: 127.0.0.1
####端口号
port: 5672
####账号
username: guest
####密码
password: guest
### 地址
virtual-host: /meiteVirtualHosts
server:
port: 8080
###模拟演示死信队列
mayikt:
dlx:
exchange: mayikt_dlx_exchange
queue: mayikt_order_dlx_queue
routingKey: dlx
###备胎交换机
order:
exchange: mayikt_order_exchange
queue: mayikt_order_queue
routingKey: mayikt.order
2)引入依赖