Rocketmq简介及核心概念详解(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_36279318/article/details/88927326

一、rocketmq简介

  • rocketmq是一款分布式、队列模型的消息中间件,由阿里巴巴研发借鉴参考了JMS规范MQ实习,更参考了优秀的开源消息中间件kafka,并结合阿里巴巴的实际业务需求,在天猫双十一的场景,实现业务消峰,分布式事务的优秀框架。
  • 底层代码编写清晰优秀,采用Netty NIOl框架实现数据通信。
  • 3.X版本弃用Zookeeper,内部使用更轻量级的NameServer进行网络路由,提供了服务性能,并支持消息失败重试机制。
  • 支持集群模式、消费者负载均衡、水平扩展能力,支持广播模式。
  • 采用零拷贝原理,顺序写盘、支持亿级消息堆积能力。
  • 提供丰富的消息机制,比如顺序消息、事务消息。

二、核心概念讲解

1.专业术语

  • Producer: 消息生成者,负责消息产生,由业务系统负责产生。
  • Consumer:消息消费者,负责消费消费,由后台业务系统负责异步消费。
  • Push Consumer:Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Listener接口方法。
  • Pull Consumer:Consumer的一种,应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制。
  • Producer Group:一类producer的集合名称,这类Producer通常发送一类消息,且发送逻辑。
  • Consumer Group:一类Consumer的集合名称,这类Consumer通常消费一类消息,且发送逻辑。
  • Broker:消息中转角色,负责存储消息,转发消息,一般也称为Server。
  • 集群消费:一个Consumer Group中的Consumer实例平均分摊消费消息。例如某个Topic有9条消息,其中一个Consumer Group有3个 实例(可能是3个进程或3台机器),那么每隔实例只消费其中的3条消费。
  • 广播消费:一条消息被多个Consumer消息,即使这些 Consumer属于同一个 Consumer Group,消息也会被Consumer Group中的每隔 Consumer都消费一次。
  • 顺序消费:指消息的消费顺序和产生顺序相同,在有些业务逻辑 下 ,必须保证顺序。比如订单的生成、付款、发货,这3个消息必须按顺序处理才行。

三、rocketmq应用场景

         分布式开放消息系统(RocketMQ)的原理与实践

四、rocketmq可视化管理控制台代建

1. 下载开源的rocketmq-externals项目:https://github.com/apache/rocketmq-externals

2. 找到rocketmq-console,先编辑一下rocketmq-console里面的application.properties文件,将项目使用的rocketmq.config.namesrvAddr配置上去(或者在项目启动时,以参数的形式配进去)

server.contextPath=
server.port=8082
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=127.0.0.1:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true

3.将rocktmq-console打成jar包,得到rocketmq-console-ng-1.0.0.jar

mvn clean package -Dmaven.test.skip=true

4.运行jar包,启动项目(在本地可以直接导入项目到IDEA启动项目),这里也可以设置rocketmq.config.namesrvAdd

java -jar rocketmq-console-ng-1.0.0.jar --server.port=12581 --rocketmq.config.namesrvAddr=127.0.0.1:9876

5.控制台界面如下:

6.参考博客 :https://www.cnblogs.com/miaoying/p/10319840.html

五、rocketmq项目搭建

参考官网:http://rocketmq.apache.org/docs/quick-start/

步骤如下:

扫描二维码关注公众号,回复: 7599126 查看本文章

1.环境:IDEA2019、Maven、JDK1.8(由于Rocketmq项目基于SpringBoot)

2.下载地址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip

3.配置环境变量:

      变量名:ROCKETMQ_HOME

      变量值:F:\rocketmq-all-4.4.0-bin-release

4.启动nameserver命令为: start mqnamesrv.cmd    

   启动broker命令为:   start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

5.在IDEA中创建Producer和consumer实现消息通信

Demo案例演示

consumer消费者----配置参数

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET):Consumer启动后,默认从什么位置开发消费,默认为CONSUME_FROM_LAST_OFFSET

consumer.setAllocateMessageQueueStrategy():设置负载均衡算法实现策略

consumer.setSubscription():设置订阅关系

consumer.setMessageListener():设置消息监听

consumer.setOffsetStore():设置消息进度存储

consumer.setConsumeThreadMax():设置消费线程的最大数量,默认为64个线程

consumer.setConsumeThreadMin():设置消费线程的最小数量,默认为20个线程

consumer.setPullThresholdForQueue():本地队列缓存消息最大数,默认为1000

consumer.setConsumeMessageBatchMaxSize():批量消费消息,一次消费多少条消息,默认为1条

consumer.setPullBatchSize():批量拉取消息,一次性最多拉取多少条消息,默认为32条

consumer.setPullInterval():设置消息拉取间隔,默认为0

consumer端应用

/**
 * 源码分析DefaultMQPushConsumer的处理流程:
 * DefaultMQPushConsumer主要功能实现在DefaultMQPushConsumerImpl类中
 * 处理消息是在:pullMessage()方法中的PullCallBack()方法中
 */
public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {
        /**
         * 1.使用消费者组名称进行实例化(消费者类型:DefaultMQPushConsumer,DefaultMQPullConsumer)
         * 2.同一个GroupName下的多个消费者Consumer可以提高并发处理能力,GroupName需要和消息模式(MessageModel)配合使用
         * 3.RocketMQ支持两种消息模式:
         *      Clusting:一个Consumer只能消费同一个GroupName里面的一部分消息,从而实现负载均衡
         *      Broadcasting:一个Consumer可以消费GroupName里面的所有消息
         */
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");
        /**
         * 指定nameserver的地址和端口号,可以填写多个使用分号隔开。例如:172.22.41.203;172.21.42.204:9876
         * 达到消除单点故障
         */
        consumer.setNamesrvAddr("localhost:9876");

        /**
         * 消费者订阅消费主题,可以订阅一个或多个,"null"或"*"表示订阅多个主题
         * consumer.subscribe("TopicTest", "tag1||tag2||tagn");
         */
        consumer.subscribe("TopicTest", "*");
        // Register callback to execute on arrival of messages fetched from brokers.
        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
                for (MessageExt msg :msgs) {
                    System.out.println(msg);
                }
                //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");
    }
}

 producer生产者----配置参数

producer.createTopic():在发送消息时,自动创建服务器不存在的topic,需要指定key

producer.setDefaultTopicQueueNums():在发送消息时,自动创建服务器不存在的topic,默认创建队列数为4

producer.send():设置发送消息超时时间,单位为毫秒

producer.setCompressMsgBodyOverHowmuch():发送消息体超过多大进行压缩(Consumer收到消息自动压缩),默认为1024*4,单位字节

producer.setRetryTimesWhenSendFailed():设置生产者发送消息重试次数,默认重试2次

producer.setMaxMessageSize():设置发送消息的大小,默认 maxMessageSize = 1024 * 1024 * 4; // 4M,如果超过最大设置就会报异常。

producer端应用

/**
 * Consumer和Producer都必须设置Topic,GroupName,NameServer地址以及端口号
 * 最后再进入发送和接收逻辑
 */
public class SyncProducer {

    public static void main(String[] args) throws Exception {
        //使用生产者组名称进行实例化
        DefaultMQProducer producer = new
                DefaultMQProducer("please_rename_unique_group_name");
        //指定nameserver的地址
        producer.setNamesrvAddr("localhost:9876");
        //启动生产者
        producer.start();
        for (int i = 0; i < 3; i++) {
            //创建消息实例,指定topic、tag、消息内容
            //topic:只允许是^[%|a-zA-Z0-9_-]+$组成的字符串,不能是汉字
            Message msg = new Message("TopicTest",
                    "TagA",
                    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)
            );
            //生产将消息发送给一个broker对象处理
            SendResult sendResult = producer.send(msg);
            System.out.println("发送对象信息为"+JSON.toJSONString(sendResult));
        }
        //关闭生产者实例后此对象不再使用
        //producer.shutdown();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36279318/article/details/88927326
今日推荐