RabbitMQ高级特性 (限流,TTL, 死信队列)

1、 消费端限流

Consumer限流机制:

  1,确保ack机制为手动确认。

  2,配置prefeteh参数,每次拉取多少消息,根据自己系统能承受的最大值来定。

读取消息—>手动确认消息—>才能再拉取消息

2、超时配置 TTL

TTL全程 time to live

当消息到达存活时间后,还没有被消费,则会自动清除。

RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间,如果两个都设置的话以较短的为准。

对整个队列设置

    @Bean("bootQueue")
    public Queue bootQueue(){
      // .tll(2000)队列中过期时间为2s
return QueueBuilder.durable(QUEUE_NAME).ttl(2000).build(); }

发消息时设置,通过MessagePostProcessor进行后置处理

复制代码
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
          //消息过期时间为五秒 message.getMessageProperties().setExpiration(
"5000"); return message; } };

//传入messagePostProcessor参数
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"confirm","test confirm",messagePostProcessor);
 
复制代码

 

3、死信队列

英文缩写DLX, dead letter Exchange,死信交换机,当消息成为Dead Message后,可以被重新发送到另一个交换机中,这个交换机就是DLX。

 

 

 消息成为死信的三种情况:

1、消息队列到达长度限制

2、消费者拒绝接收消息,basicNack或者basicReject,并且不把消息重新放到交换机中,requeue=false

3、原队列存在消息过期设置,消息达到超时时间未被消费

队列绑定私信交换机:

给队列设置参数 x-dead-letter-exchange 和 x-dead-letter-routing-key

4、延迟队列

延迟队列,即消息进入队列后并不会马上投递给消费者,只有到达指定时间后才会被消费。

需求:1,下单后三十分钟未支付,取消订单,回滚库存。

2,新用户注册七天后,发送短信问候。

实现方式:1,使用定时器扫表,问题:不优雅,有误差

2,延迟队列

 

 

 

RabbitMQ并没有提供延迟队列的功能,但是可以用TTL+私信队列来实现。

 

 

 

5、消息补偿

如果有更高要求的消息可靠性保障,可以用消息补偿机制,简单地说就是把消息写到数据库里。

 

 

 

 

这个图看起来好像很复杂,其实只做到了三件事情:

发消息

收到消息确认
检查比对是不是收到消息了


详细说明消息补偿流程

可以参考下面链接 P34
14_应用问题-幂等性保障_哔哩哔哩_bilibili 

posted @   wwwwwwwty  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示