5. rocketmq延迟消息队列

mq 消息队列 专栏收录该内容
10 篇文章 1 订阅

什么是延迟消息队列

对于消息中间件来说,producer将消息发送到mq的服务器,但并不期望这条消息马上被消费,而是推迟到当前时间点之后的某个时间点后再投递到queue中让consumer进行消费。

也可以认为是定时消息。

延迟消息的使用场景很多,一种比较常见的场景就是在电商系统中,订单创建后,会有一个等待用户支付的时间窗口,一般为30分钟,30分钟后consumer收到这条订单消息,然后程序去订单表中检查当前这条订单的支付状态,如果是未支付的状态,则自动清理掉。

延迟消息原理是采用时间轮,阿里开源的rocketmq的延迟消息是阉割过的,只支持18个级别的延迟时间。采用时间轮算法可以做到任意级别的延迟。关于时间轮算法后续再分析。

生产者

生产者关键一行代码就是message.setDelayTimeLevel(3);设置一下消息的延迟等级。

public static void main(String[] args) throws Exception {
        //Instantiate with a producer group name.
        DefaultMQProducer producer = new DefaultMQProducer("example_group_name");
        producer.setNamesrvAddr("node1:9876");
        //Launch the instance.
        producer.start();

        Message message = new Message("TopicTest", ("this is a delay message:" + "hhhhhhhhhh").getBytes());

        //"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"
        message.setDelayTimeLevel(3);//3指上面第三个策略,是10秒。
        producer.send(message, new SendCallback() {

            //消息发送成功回调
            @Override
            public void onSuccess(SendResult sendResult) {
                log.info(sendResult.toString());
            }

            //消息异常回调
            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
                //补偿机制,根据业务情况进行使用,看是否进行重试
            }
        });


        TimeUnit.SECONDS.sleep(3);

        producer.shutdown();
    }

消费者

消费者这里还是借用上一篇文章中的普通消费者。

public static void main(String[] args) throws Exception {
        normal();//普通消费

//        order();//顺序消费
    }

    private static void normal() throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("example_group_name");
        consumer.setNamesrvAddr("node1:9876");

        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        consumer.subscribe("TopicTest", "*");
        consumer.setConsumeThreadMin(3);
        consumer.setConsumeThreadMax(6);

        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            for (MessageExt msg : msgs) {
//                    System.out.println("收到消息," + new String(msg.getBody()));
                System.out.println("queueId:"+msg.getQueueId()+",orderId:"+new String(msg.getBody())+",i:"+msg.getKeys());
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();

        System.out.printf("Consumer Started.%n");
    }

运行

先启动消费者,等待接收消息。
然后启动发送者,发送消息,可以看到过了10秒钟后,消费者可以消费到消息。

  • 0
    点赞
  • 1
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p style="font-size:14px;color:#333333;"> <span style="color:#000000;">RocketMQ </span><span style="color:#000000;">是阿里巴巴在</span><span style="color:#000000;">2012</span><span style="color:#000000;">年开源的分布式消息中间件,目前已经捐赠给</span><span style="color:#000000;"> Apache </span><span style="color:#000000;">软件基金会,并于</span><span style="color:#000000;">2017</span><span style="color:#000000;">年</span><span style="color:#000000;">9</span><span style="color:#000000;">月</span><span style="color:#000000;">25</span><span style="color:#000000;">日成为</span><span style="color:#000000;">Apache </span><span style="color:#000000;">的顶级项目。作为经历过多次阿里巴巴双十一这种</span><span style="color:#000000;">“</span><span style="color:#000000;">超级工程</span><span style="color:#000000;">”</span><span style="color:#000000;">的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。其主要功能有</span><span style="color:#000000;">1.</span><span style="color:#000000;">灵活可扩展性、</span><span style="color:#000000;">2.</span><span style="color:#000000;">海量消息堆积能力、</span><span style="color:#000000;">3.</span><span style="color:#000000;">支持顺序消息、</span><span style="color:#000000;">4.</span><span style="color:#000000;">多种消息过滤方式、</span><span style="color:#000000;">5.</span><span style="color:#000000;">支持事务消息、</span><span style="color:#000000;">6.</span><span style="color:#000000;">回溯消费等常用功能。</span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">RocketMQ <span>核心的四大组件:</span>Name Server<span>、</span>Broker<span>、</span>Producer<span>、</span>Consumer <span>,每个组件都可以部署成集群进行水平扩展。</span></span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="color:#000000;">2、适应人群</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">有一定的Java基础,并且有分布式项目开发经验。</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="color:#000000;">3、课程价值</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">可以让初学者对分布式系统解耦有一定认识,并且能够通过快速使用RocketMQ实现分布式服务的异步通信,同时本课程还会通过项目案例实战让学员对RocketMQ的应用场景有所体会,最后再通过源码角度让学员对RocketMQ的原理有所理解,不仅做到“知其然”,亦“知其所以然”。</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="color:#000000;">4、课程收获</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">1. <span style="font-size:14px;">理解消息中间件MQ的优势和应用场景</span></span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">2. 掌握RocketMQ的核心功能,以及各种消息发送案例</span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">3. 通过电商项目深刻理解RocketMQ在使用项目中的落地应用</span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">4. 通过RocketMQ高级功能和源码学习,对RocketMQ的技术细节和原理有更加透彻的理解</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span>5、课程亮点</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span>l<span style="font-size:9px;">  </span></span><span style="font-size:17px;">核心功能</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>MQ介绍</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>环境准备</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>RocketMQ高可用集群搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>各种消息发送样例</span> </p> <p style="font-size:14px;color:#333333;"> <span>l<span style="font-size:9px;">  </span></span><span>综合练习</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>项目背景介绍</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>功能分析</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>项目环境搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>下单功能,保证各服务的数据一致性</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>确认订单功能,通过消息进行数据分发</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>整体联调</span> </p> <p style="font-size:14px;color:#333333;"> <span>l<span style="font-size:9px;">  </span></span><span>高级功能</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息的存储和发送</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息存储结构</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>刷盘机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息的同步复制和异步复制</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>负载均衡</span> </p> <p style="font-size:14px;color:#333333;"> <span>l<span style="font-size:9px;">  </span></span><span>源码分析</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>路由中心NameServer</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息生产者Producer</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息存储</span> </p> <p style="font-size:14px;color:#333333;"> <span>n<span style="font-size:9px;">  </span></span><span>消息消费Consumer</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span>6、主讲内容</span></strong> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="font-size:19px;">章节一:核心功能</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span>1.<span style="font-size:9px;">     </span>快速入门</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>MQ介绍</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>作用</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>注意事项</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>各MQ产品比较</span> </p> <p style="font-size:14px;color:#333333;"> <span>2.<span style="font-size:9px;">     </span>RocketMQ环境搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>环境准备</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>安装RocketMQ</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>启动RocketMQ</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>测试RocketMQ</span> </p> <p style="font-size:14px;color:#333333;"> <span>e)<span style="font-size:9px;">     </span>关闭RocketMQ</span> </p> <p style="font-size:14px;color:#333333;"> <span>3.<span style="font-size:9px;">     </span>RocketMQ高可用集群搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>集群各角色介绍</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>集群搭建方式</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>双主双从集群搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>集群监控平台</span> </p> <p style="font-size:14px;color:#333333;"> <span>4.<span style="font-size:9px;">     </span>各种消息发送样例</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>同步消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>异步消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>单向消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>顺序消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>e)<span style="font-size:9px;">     </span>批量消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>f)<span style="font-size:9px;">      </span>过滤消息</span> </p> <p style="font-size:14px;color:#333333;"> <span>g)<span style="font-size:9px;">     </span>事务消息</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="font-size:19px;">章节二:项目实战</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span>1.<span style="font-size:9px;">    </span>项目背景介绍</span> </p> <p style="font-size:14px;color:#333333;"> <span>(1)<span style="font-size:9px;">    </span>电商高可用MQ实战</span> </p> <p style="font-size:14px;color:#333333;"> <span>2.<span style="font-size:9px;">    </span>功能分析</span> </p> <p style="font-size:14px;color:#333333;"> <span>(1)<span style="font-size:9px;">    </span>下单功能</span> </p> <p style="font-size:14px;color:#333333;"> <span>(2)<span style="font-size:9px;">    </span>支付功能</span> </p> <p style="font-size:14px;color:#333333;"> <span>3.<span style="font-size:9px;">    </span>项目环境搭建</span> </p> <p style="font-size:14px;color:#333333;"> <span>(1)<span style="font-size:9px;">    </span>SpringBoot</span> </p> <p style="font-size:14px;color:#333333;"> <span>(2)<span style="font-size:9px;">    </span>Dubbo</span> </p> <p style="font-size:14px;color:#333333;"> <span>(3)<span style="font-size:9px;">    </span>Zookeeper</span> </p> <p style="font-size:14px;color:#333333;"> <span>(4)<span style="font-size:9px;">    </span>RocketMQ</span> </p> <p style="font-size:14px;color:#333333;"> <span>(5)<span style="font-size:9px;">    </span>Mysql</span> </p> <p style="font-size:14px;color:#333333;"> <span>4.下单功能,保证各服务的数据一致性</span> </p> <p style="font-size:14px;color:#333333;"> <span>5.确认订单功能,通过消息进行数据分发</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="font-size:19px;">章节三:高级功能</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span>1. 消息的存储和发送</span> </p> <p style="font-size:14px;color:#333333;"> <span>2. 消息存储结构</span> </p> <p style="font-size:14px;color:#333333;"> <span>3. 刷盘机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>(1)<span style="font-size:9px;">    </span>同步刷盘</span> </p> <p style="font-size:14px;color:#333333;"> <span>(2)<span style="font-size:9px;">    </span>异步刷盘</span> </p> <p style="font-size:14px;color:#333333;"> <span>4. 消息的同步复制和异步复制</span> </p> <p style="font-size:14px;color:#333333;"> <span>5. 负载均衡</span> </p> <p style="font-size:14px;color:#333333;"> <span>(1)<span style="font-size:9px;">    </span>Producer负载均衡</span> </p> <p style="font-size:14px;color:#333333;"> <span>(2)<span style="font-size:9px;">    </span>Consumer负载均衡</span> </p> <p style="font-size:14px;color:#333333;"> <strong><span style="font-size:19px;">章节四:源码分析</span></strong> </p> <p style="font-size:14px;color:#333333;"> <span>1.<span style="font-size:9px;">     </span>路由中心NameServer</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>NameServer架构设计</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>NameServer启动流程</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>NameServer路由注册和故障剔除</span> </p> <p style="font-size:14px;color:#333333;"> <span>2.<span style="font-size:9px;">     </span>消息生产者Producer</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>生产者启动流程</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>生产者发送消息流程</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>批量发送</span> </p> <p style="font-size:14px;color:#333333;"> <span>3.<span style="font-size:9px;">     </span>消息存储</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>消息存储流程</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>存储文件与内存映射</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>存储文件</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>实时更新消息消费队列和存储文件</span> </p> <p style="font-size:14px;color:#333333;"> <span>e)<span style="font-size:9px;">     </span>消息队列与索引文件恢复</span> </p> <p style="font-size:14px;color:#333333;"> <span>f)<span style="font-size:9px;">      </span>刷盘机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>4.<span style="font-size:9px;">     </span></span><span>过期文件删除机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>a)<span style="font-size:9px;">     </span>消息消费Consumer</span> </p> <p style="font-size:14px;color:#333333;"> <span>b)<span style="font-size:9px;">     </span>消费者启动流程</span> </p> <p style="font-size:14px;color:#333333;"> <span>c)<span style="font-size:9px;">      </span>消息拉取</span> </p> <p style="font-size:14px;color:#333333;"> <span>d)<span style="font-size:9px;">     </span>消息队列负载均衡和重新分布机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>e)<span style="font-size:9px;">     </span>消息消费过程</span> </p> <p style="font-size:14px;color:#333333;"> <span>f)<span style="font-size:9px;">      </span>定时消息机制</span> </p> <p style="font-size:14px;color:#333333;"> <span>g)<span style="font-size:9px;">     </span>顺序消息</span> </p>
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值