RabbitMQ-进阶

生产端的可靠性投递

定义

  1. 保障消息的成功发出
  2. 保障MQ节点的成功接收
  3. 发送端收到MQ节点(Broker)确认应答
  4. 完善的消息进行补偿机制

BAT互联网大厂解决方案

  1. 消息落库,对消息状态进行打标
  2. 消息的延迟投递,做二次确认,回调检查

消息落库

在这里插入图片描述

Callback

在这里插入图片描述

  1. callback:统一服务

幂等性

定义

在这里插入图片描述

消费端的幂等性

  1. 消费端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们收到了多条一样的消息
  2. 业界主流操作
  • 唯一ID+指纹码 机制,利用数据库主键去重
  • 利用Redis的原子性去实现

ID+指纹码

在这里插入图片描述

redis

在这里插入图片描述

P16

SpringBoot中


1. 参考

Channel参数详解

2. 小代码

   @PostMapping(value = "/test/receiveMq")
    public void receiveMq(){
        Channel channel = connection.createChannel(false);
        GetResponse response = null;
        String s;
        try{
            response = channel.basicGet(RabbitMqEnum.TEST.getQueue(), false);
            s = new String(response.getBody(), StandardCharsets.UTF_8);
//            throw new IOException("就试试");
            channel.basicAck(response.getEnvelope().getDeliveryTag(),false);
        }catch(IOException e){
            try{
                if(response!=null){
                    channel.basicNack(response.getEnvelope().getDeliveryTag(),false,true);
                }
            }catch(Exception exception){
                exception.printStackTrace();
            }

            e.printStackTrace();
            return;
        }

        log.info("打印:[{}]",response);
        log.info("打印:[{}]",s);

    }

死信队列


1.参考

死信队列配合channel.basicNack(Long,false,flase)

2. 最重要配置

// 该队列即死信队列
    public Queue successKillDeadQueue(){
        HashMap<String, Object> argsMap = Maps.newHashMap();
        //固定写法,这里设置消息死后发送到的交换机和路由key
        argsMap.put("x-dead-letter-exchange",environment.getProperty("mq.kill.item.success.kill.dead.exchange"));
        argsMap.put("x-dead-letter-routing-key",environment.getProperty("mq.kill.item.success.kill.dead.routing.key"));
        //设置TTL
//        argsMap.put("x-message-ttl",10000);
        return new Queue(environment.getProperty("mq.kill.item.success.kill.dead.queue"),true,false,false,argsMap);
    }

3. 场景举例

用户未支付: 用户下单后,可将订单放至私信队列中,设置TTL,当超时过后,将进入由另一个队列并消费,此时判断用户是否有下单记录,若有则无事发生,若没有则做相应逻辑


A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值