rabbitmq 延时队列研究旅途

上班就要干活给客户解决问题

场景:客户有需求需要做订单超时功能,在超时范围内的时间都可以进行支付操作因为最近在做java web方向开发,第一时间就想到了定时器解决,但是考虑性能还

是放弃了,在经过百度的海洋中发现rabbitmq可以实现此需求好像还不错就使用此款方案了,初步查看百度或一些文档得知rabbitmq 可以用一种叫死信队列的方式实

现,经过测试这种实现方式有个问题,比如说生产一条10秒超时的消息,再立刻生产一条5秒的超时消息,会出现异常后者的消息无法消费,这种场景需求还是有的,

所以继续探索其他方案。最后找到rabbitmq 延时队列插件实现方式,原来rabbitmq已经通过插件方式实现了怎么安装就不多说了网上一大堆,最后有这种类型就对了。

队列配置类

@Configuration
public class QueueConfiguration {

    @Bean
    public Queue demoQueue(){
        return new Queue("DEMO",true);
    }

    @Bean
    public Binding demoBinding(Queue demoQueue,CustomExchange cfgUserDelayExchange){
        return BindingBuilder.bind(demoQueue()).to(cfgUserDelayExchange).with("DEMO").noargs();
    }
}

队列监听类
@Component
public class ReceiverMessageDemo {
    @RabbitListener(queues = "DEMO")
    public void process(Message message, Channel channel) throws IOException {
        try {
            // 消息内容
            String content = new String(message.getBody(), "UTF-8");
            System.out.println("测试接收消息   "+content);
            
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

        }
    }
}

生产消息方法 可以把它封装个service
//10000 == 10触发监听
rabbitTemplate.convertAndSend("delay_exchange", "DEMO", messages, message -> { message.getMessageProperties().setHeader("x-delay", 10000); return message; });

如果感觉消费消息的慢可以通过简单的增加‘队列监听类’ 缓解(就是复制几份队列监听类监听同一队列),经过测试确有提速,速度大部分还是和队列的持久化设置有关。

注意消费者类不能超过配置文件的配置spring.rabbitmq.listener.simple.max-concurrency

队列操作还远不如此,继续前中。。。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值