利用DLX, 当消息在一个队列中变成死信(dead message)之后, 它能被重新publish到另一个Exchange, 这个Exchange就是DLX
DLX也是一个正常的Exchange, 和一般的Exchange没有区别, 它能在任何队列上被指定, 实际上就是设置某个队列的属性为死信队列
当这个队列中有死信时, RabbitMQ就会自动将这个消息重新发布到设置的Exchange上去, 进而被路由到另一个队列 可以监听这个队列中消息做相应的处理, 这个特性可以弥补RabbitMQ3.0以前支持的immediate参数的功能
消息被拒绝 (basic.reject or basic.nack) 且带 requeue=false 参数
消息的TTL-存活时间已经过期
队列长度限制被超越(队列满)
首先要设置死信队列的exchange和queue, 然后进行绑定
1. Exchange : dlx.exchange
2. Queue : dlx.queue
3. RoutingKey : #
然后正常声明交换机, 队列, 绑定, 只不过需要在队列加上一个扩展参数即可 : arguments.put(“x-dead-letter-exchange”, “dlx.exchange”)
1. 列信息因消费不及时大量积压,消费方服务先处理不及时会影响到队列的生产者,进而会影响到所有消费此topic的队列
2. 队列的消息超时后消失,生产者和消费者完全无感知,只能靠查落地存储的历史记录,很不方便同时业务无法再消费处理
增加延时队列,通过dead-letter方式实现超过有效期后进入可以被消费的队列中,让消费者处理
计算倒计时,再放入延时队列让消费者处理
可接受队列,延时等待队列,死信队列分别加上特定的前缀
然后通过元注解参数来区分生产者发送的队列类型
在注解监听器监听参数,如果是延时队列发送给延时等待队列,普通队列发送给可接受队列
所有消费者统一消费可接受队列
消息在发送到消息队列RocketMQ版服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者。比如:常见的场景电商交易中超时未支付关闭订单的场景,通过延时消息在30分钟后投递给消息端进行关单。
开源 RocketMQ 针对目前只支持固定精度的定时消息。生产端发送消息,通过设delayTimeLevel时间级别后,可实现消息不立马被消费者消费到,而是按照18个级别 ("1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h")。比如支持5秒、10秒的Level,那么用户只能发送5秒延迟或者10秒延迟,不能发送8秒延迟的消息。
优点: 设计简单,把所有相同延迟时间的消息都先放到一个队列中,定时扫描,可以保证消息消费的有序性
缺点: 定时器采用了timer,timer是单线程运行,如果延迟消息数量很大的情况下,可能单线程处理不过来,造成消息到期后也没有发送出去的情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)