一、消息中间件产生了消息堆积如何解决
RabbitMQ如果产生了消息堆积如何处理?
产生的背景:如果没有及时的消费者消费消息,生产者一直不断往队列服务器存放消息
会导致消息堆积。
两种场景:
1. 没有消费者消费的情况下:
- 死信队列、设置消息有效期
- 相当于对我们的消息设置有效期,在规定的时间内如果没有消费的话,自动过期,过期的时候会执行客户端回调监听的方法将消息存放到数据库记录,后期实现不补偿。
2. 有一个消费者消费的情况:
- 应该提高我们的消费者 消费实现集群
二、RabbitMQ如何保证消息不丢失
RabbitMQ如何彻底保证我们的消息不丢失?
- MQ服务器端应该消息持久化到硬盘
生产者
使用消息确认机制
百分能够将消息投递到MQ成功消费者
使用手动acm机制
确认消息百分百消费成功
如果队列容量满了,在继续投递可能会丢失
死信队列
死信队列
:称做为备胎队列
,消息中间件队列因为某种消费拒绝存放该消息,可以转移到死信队列中存放。
死信队列产生的背景:
- 生产者投递消息到MQ中,消息过期了;
- 队列的已经达到最大长度(队列存放消息满了)MQ拒绝接受存放该消息。
消费者多次消费该消息失败的情况,也会存放死信
。
实现我们的死信队列
三、RabbitMQ整合死信队列
1.application.yml
spring:
rabbitmq:
####连接地址
host: 127.0.0.1
####端口号
port: 5672
####账号
username: guest
####密码
password: guest
### 地址
virtual-host: /meite_rabbitmq
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8080
mayikt:
###创建死信队列交换机和队列路由键
dlx:
exchange: mayikt_order_dlx_exchange
queue: mayikt_order_dlx_queue
routingKey: dlx
###创建订单队列交换机和队列路由键
order:
exchange: mayikt_order_exchange
queue: mayikt_order_queue
routingKey: mayikt.order
2.DeadLetterMQConfig 绑定交换机 队列 routing key
@Component
public class DeadLetterMQConfig {
//订单交换机
@Value("${mayikt.order.exchange}")
private String orderExchange;
//订单队列
@Value("${mayikt.order.queue}")
private String orderQueue;
//订单路由key
@Value("${mayikt.order.routingKey}")
private String orderRoutingKey;
//死信交换机
@Value("${mayikt.dlx.exchange}")
private String dlxExchange;
//死信队列
@Value("${mayikt.dlx.queue}")
private String dlxQueue;
//死信路由
@Value("${mayikt.dlx.routingKey}")
private String dlxRoutingKey;