rocketmq学习 实战(三)

前言

基于前两篇,RocketMq 学习 中文文档(一) RocketMq 集群搭建 部署 (2m-2s-async)我们已经了解了rocketmq的工作流程和集群搭建,本文介绍java接入的代码部分.下篇:顺序消息和事务消息

目录

1.生产者
2.消费者
3.演示一下master宕机:
4.消息重试:
5.广播消费
6.集群消费

正文

1.普通消费

依赖

<dependency>
			<groupId>org.apache.rocketmq</groupId>
			<artifactId>rocketmq-client</artifactId>
			<version>4.3.2</version>
</dependency>

1.生产者

/**
     * 普通消息生产者
     *
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        //设置组名,并实例化
        DefaultMQProducer producer = new
                DefaultMQProducer("producerGroup1");
        // 名称服务,分号分割
        producer.setNamesrvAddr("192.168.229.5:9876;192.168.229.6:9876");
        producer.start();
        for (int i = 0; i < 10; i++) {
            //消息实例
            Message msg = new Message("topic1" /* Topic */,
                    "TagA" /* Tag */,
                    ("Hello RocketMQ " +
                            i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            SendResult sendResult = producer.send(msg);
            System.out.printf("%s%n", sendResult);
        }
        producer.shutdown();
    }
  1. 发送消息是向2个节点的broker的master发送,发送使用默认的负载均衡机制,有的发向broker-a,有的发向broker-b
    在这里插入图片描述
  2. 因为使用的主从结构,slave与master的消息同步
    在这里插入图片描述

2.消费者

  /**
     * 普通消息消费者
     * 采用的是Consumer Push的方式
     */
    @Test
    public void test2() {
        //实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup1");
        consumer.setNamesrvAddr("192.168.229.5:9876;192.168.229.6:9876");
        try {
            //订阅topic1下的所有tag的消息
            consumer.subscribe("topic1", "*");
            //注册回调
            consumer.registerMessageListener(new MessageListenerConcurrently() {
                @Override
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                                ConsumeConcurrentlyContext context) {
                    System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });
            consumer.start();
            System.out.printf("Consumer Started.%n");
            while (true) {
            }
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }

3.演示一下master宕机:

此刻默认是从master上消费,当master都健在时,一切正常.
在这里插入图片描述
在这里插入图片描述

此刻:把节点B的master停掉,master有一些消息未消费,则

停掉broker-b-master前(有几条消息未被消费):
在这里插入图片描述
停掉broker-b-master后: b节点只有一个slave(只能从此节点消费,不能发送了)
在这里插入图片描述
此刻发送10条消息测试,发现broker-b节点不再接收新消息,新消息全到master活着的A节点
在这里插入图片描述
启动一个消费者,消费topic1下的所有
可以看到,broker-b分片上的遗存的消息仍可被消费
在这里插入图片描述
主从方式保证了消息的高可用,现在是异步方式,会发生极少量消息丢失,如果业务是严格要求消息可用性,可使用同步刷盘,可靠性100%,性能相较异步略低,但也很高.

4.消息重试:

消息重试有两种,1.发送失败,2.消费失败

4.1发送失败

在这里插入图片描述
由于网络抖动,或其他因素导致发送失败,可以设置重试次数,在2000(超时时间范围内)

4.1消费失败

消息重试重要的功能在消费失败时,有两种失败情况:1.timeout,2.exception,rocketmq提供两种状态:1. CONSUME_SUCCESS 2. RECONSUME_LATER
1.timeout
当发生超时时,消费端会一直重试,直至成功
2.exception
当发生异常时,可以控制返回状态为CONSUME_SUCCESSRECONSUME_LATER,当返回RECONSUME_LATER时,broker会保留这条消息,而消费端会根据设置的次数进行重复消费,一般重试个3次就差不多了,有个重试策略,重试间隔时间越来越长: 10s、30s、1mins、2mins等,当超过次数后,需要额外处理失败的消息.

   /**
     * 普通消息消费者
     */
    @Test
    public void test4() {
        //实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup1");
        consumer.setNamesrvAddr("192.168.229.5:9876;192.168.229.6:9876");
        try {
            //订阅topic1下的所有tag的消息
            consumer.subscribe("topic1", "*");
            //注册回调
            consumer.registerMessageListener(new MessageListenerConcurrently() {
                int count = 1;
                @Override
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                                ConsumeConcurrentlyContext context) {
                    try {
                        String body = new String(msgs.get(0).getBody(), "utf-8");
                        System.out.printf("%s Receive New Messages: %s %n", count++, msgs);
                        if ("Hello RocketMQ 3".equals(body)) {
                            if(msgs.get(0).getReconsumeTimes() ==4){
                                //TODO 超过最大重试次数后,应手动处理这条消息
                            }

                            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                        }
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });
            consumer.start();
            System.out.printf("Consumer Started.%n");
            while (true) {
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

结果如下:
在这里插入图片描述
显然,同一条消息被消费了多次,时间间隔越来越长,业务中可根据重试的次数msg.getReconsumeTimes() 来保证消息失败时,应该手动管理这条消息了

5.广播消费

启动两个客户端即可

  /**
     * 普通消息消费者1
     */
    @Test
    public void test5() {
    	```此处省略代码```
            //广播消费
            consumer.setMessageModel(MessageModel.BROADCASTING);
            	```此处省略代码```
                    System.out.printf("consumer1:   %s Receive New Messages: %s %n", count++, msgs);
	```此处省略代码```
    }

    /**
     * 普通消息消费者2
     */
    @Test
    public void test6() {
		  ```此处省略代码```
            //广播消费
            consumer.setMessageModel(MessageModel.BROADCASTING);
            	```此处省略代码```
            System.out.printf("consumer2:  %s Receive New Messages: %s %n", count++, msgs);
	     ```此处省略代码```
    }

结果两个节点消费情况一样:
在这里插入图片描述
在这里插入图片描述

6.集群消费

同上,开两个消费端,消费模式改为集群 CLUSTERING,测试producer发10条消息,可以看到,consumer1+consume2两者共消费10条,各不重复,符合预期
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、rocketmq入门到精通视频教程目录大纲 001-001_RocketMQ_简介 002-002_RocketMQ_核心概念详解 003-003_RocketMQ_集群构建模型详解(一) 004-004_RocketMQ_集群构建模型详解(二) 005-005_RocketMQ_双主模式集群环境搭建 006-006_RocketMQ_控制台使用讲解 007-007_RocketMQ_Broker配置文件详解 008-008_RocketMQ_helloworld示例讲解 009-009_RocketMQ_整体架构概述详解 010-010_RocketMQ_Producer_API详解 011-011_RocketMQ_Producer_顺序消费机制详解 012-012_RocketMQ_Producer_事务消息机制详解 013-013_RocketMQ_Consumer_Push和Pull模式及使用详解 014-014_RocketMQ_Consumer_配置参数详解 015-015_RocketMQ_Consumer_重试策略详解 016-016_RocketMQ_Consumer_幂等去重策略详解 017-017_RocketMQ_消息模式 及使用讲解 018-018_RocketMQ_双主双从集群环境搭建与使用详解 019-019_RocketMQ_FilterServer机制及使用详解 020-020_RocketMQ_管理员命令 二、rocketmq实战视频教程目录大纲 01_rocketmq_实战项目介绍 02_rocketMQ实战项目设计(一) 03_rocketMQ实战项目设计(二) 04_rocketMQ实战-环境搭建(一) 05_rocketMQ实战-环境搭建(二) 06_rocketMQ实战-生产者与spring结合 07_rocketMQ实战-消费者与spring结合 08_rocketMQ实战-数据库模型设计 09_rocketMQ实战-数据库DAO代码生成 10_rocketMQ实战-远程RPC接口设计与实现(一) 11_rocketMQ实战-远程RPC接口设计与实现(二) 12_rocketMQ实战-远程RPC接口设计与实现() 13_rocketMQ实战-下单流程(一) 14_rocketMQ实战-下单流程(二) 15_rocketMQ实战-下单流程() 16_rocketMQ实战-下单流程(四) 17_rocketMQ实战-下单流程(五) 18_rocketMQ实战-下单流程(六) 19_rocketMQ实战-下单流程(七) 20_rocketMQ实战-下单流程(八)-商品库存 21_rocketMQ实战-下单流程(九)-商品库存 22_rocketMQ实战-下单流程(十)-支付模块 23_rocketMQ实战-整体联调
RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。其主要功能有1.灵活可扩展性、2.海量消息堆积能力、3.支持顺序消息、4.多种消息过滤方式、5.支持事务消息、6.回溯消费等常用功能。RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群进行水平扩展。2、适应人群有一定的Java基础,并且有分布式项目开发经验。3、课程价值可以让初学者对分布式系统解耦有一定认识,并且能够通过快速使用RocketMQ实现分布式服务的异步通信,同时本课程还会通过项目案例实战让学员对RocketMQ的应用场景有所体会,最后再通过源码角度让学员对RocketMQ的原理有所理解,不仅做到“知其然”,亦“知其所以然”。4、课程收获1. 理解消息中间件MQ的优势和应用场景2. 掌握RocketMQ的核心功能,以及各种消息发送案例3. 通过电商项目深刻理解RocketMQ在使用项目中的落地应用4. 通过RocketMQ高级功能和源码学习,对RocketMQ的技术细节和原理有更加透彻的理解5、课程亮点l  核心功能n  MQ介绍n  环境准备n  RocketMQ高可用集群搭建n  各种消息发送样例l  综合练习n  项目背景介绍n  功能分析n  项目环境搭建n  下单功能,保证各服务的数据一致性n  确认订单功能,通过消息进行数据分发n  整体联调l  高级功能n  消息的存储和发送n  消息存储结构n  刷盘机制n  消息的同步复制和异步复制n  负载均衡l  源码分析n  路由中心NameServern  消息生产者Producern  消息存储n  消息消费Consumer6、主讲内容章节一:核心功能1.     快速入门a)     MQ介绍b)     作用c)      注意事项d)     各MQ产品比较2.     RocketMQ环境搭建a)     环境准备b)     安装RocketMQc)      启动RocketMQd)     测试RocketMQe)     关闭RocketMQ3.     RocketMQ高可用集群搭建a)     集群各角色介绍b)     集群搭建方式c)      双主双从集群搭建d)     集群监控平台4.     各种消息发送样例a)     同步消息b)     异步消息c)      单向消息d)     顺序消息e)     批量消息f)      过滤消息g)     事务消息章节二:项目实战1.    项目背景介绍(1)    电商高可用MQ实战2.    功能分析(1)    下单功能(2)    支付功能3.    项目环境搭建(1)    SpringBoot(2)    Dubbo(3)    Zookeeper(4)    RocketMQ(5)    Mysql4.下单功能,保证各服务的数据一致性5.确认订单功能,通过消息进行数据分发章节:高级功能1. 消息的存储和发送2. 消息存储结构3. 刷盘机制(1)    同步刷盘(2)    异步刷盘4. 消息的同步复制和异步复制5. 负载均衡(1)    Producer负载均衡(2)    Consumer负载均衡章节四:源码分析1.     路由中心NameServera)     NameServer架构设计b)     NameServer启动流程c)      NameServer路由注册和故障剔除2.     消息生产者Producera)     生产者启动流程b)     生产者发送消息流程c)      批量发送3.     消息存储a)     消息存储流程b)     存储文件与内存映射c)      存储文件d)     实时更新消息消费队列和存储文件e)     消息队列与索引文件恢复f)      刷盘机制4.     过期文件删除机制a)     消息消费Consumerb)     消费者启动流程c)      消息拉取d)     消息队列负载均衡和重新分布机制e)     消息消费过程f)      定时消息机制g)     顺序消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值