官网:http://rocketmq.apache.org

1、环境搭建

准备:

rocketmq-all-4.3.0-bin-release.zip

必须配置:JAVA_HOME=/home/rui/jdk1.8.0_172

 1 unzip rocketmq-all-4.3.0-bin-release.zip -d  /home/rui/
 2
 3 cd  /home/rui/
 4
 5 mv rocketmq-all-4.3.0-bin-release/ rocketmq-4.3.0
 6
 7 vim /etc/profile
 8
 9 export PATH=$PATH:/home/rui/rocketmq-4.3.0/bin
10
11 source /ect/profile

启动rocketmq,构建简单的producer-consumer model(PCM)

1)启动Name Server

1 cd /home/rui/rocketmq-4.3.0/bin
2
3 sh mqnamesrv &45 ps -ef|grep mqnamesrv

出现提示“There is insufficient memory for the Java Runtime Environment to continue.”,kafka也出现一样的问题,当时是在命令行临时指定了jvm的配置。

解决:修改bin/runserver.sh,runbroker.sh,tools.sh的JVM配置

vim runserver.sh

vim runbroker.sh,第二个注释的jvm配置还是不对劲,配置成第三个jvm参数能正常启动broker

vim tools.sh

重新启动:

2)启动broker

1 cd /home/rui/rocketmq-4.3.0/bin
2
3 sh ./mqbroker -n localhost:9876 &
4
5 ps -ef|grep mqbroker 

note:

注意broker的地址!!!下面有用到它来创建一个TopicTest

3)发送和接收消息

在启动生产者时出现异常:no route info of this topic,TopicTest

解决:

使用命令mqadmin updateTopic手动创建一个TopicTest

1 ./mqadmin updateTopic -b 192.168.0.102:10911 -p 6 -t TopicTest

在同一个xshell界面下,先启动producer,再启动consumer

1 export NAMESRV_ADDR=localhost:9876
2
3 sh./tools.sh org.apache.rocketmq.example.quickstart.Producer
4
5 sh ./tools.sh org.apache.rocketmq.example.quickstart.Consumer

producer

consumer

4)关闭broker,关闭name server

1 sh ./mqshutdown broker
2
3 sh ./mqshutdown namesrv

2、基本概念

集群 参考:http://rocketmq.apache.org/docs/rmq-arc/

1)NameServer cluster:提供服务发现和路由。每个名称服务器记录完整的路由信息​​,提供相应的读写服务,并支持快速存储扩展。

2)broker  cluster:提供TOPIC和QUEUE机制来处理消息存储。它们支持Push和Pull模型,包含容错机制(2个副本或3个副本),并提供强大的峰值填充和以原始时间顺序累积数千亿条消息的能力。Brokers还提供灾难恢复,丰富的指标统计和警报机制。

3)producer cluster:生产者支持分布式部署。 Distributed Producers通过多种负载均衡模式向Broker集群发送消息。发送过程支持快速故障并具有低延迟。

4)consumer cluster:消费者也支持Push和Pull模型中的分布式部署。它还支持群集消费和消息广播。它提供实时消息订阅机制。

两个Server 参考:http://rocketmq.apache.org/docs/rmq-arc/

1、NameServer:Broker管理,NameServer接收来自Broker集群的注册,并且提供心跳机制来检查某个broker是否存活。路由管理,每个NameServer拥有整个broker集群的路由信息和客户端查询的队列信息。

2、Broker Server:Broker Server负责消息的存储和分发,消息的查询,高可用保证等等。Broker Server有几个重要的组成部分:Remoting Module,Client Manage,Store Service,HA Service,Index Service。

1)Remoting Module:broker的入口,负责处理来自客户端的请求。

2)Client Manager:管理客户端(Producer/Consumer),维持消费者的topic订阅。

3)Store Service:提供简单的API存储消息到物理磁盘或者从物理磁盘查询消息。

4)HA Service:提供主从broker数据同步的特性。

5)Index Service:通过指定特定的键为消息建立索引,以便快速查询消息。

核心概念,参考:http://rocketmq.apache.org/docs/core-concept/

Topic:生产者(Producer)传递消息和消费者(Consumer)提取消息的类别。它跟生产者和消费者之间的关系是松耦合的。

Tag:Topic的子类别。它能标识来自同一业务模块的具有不同目的的消息。

pullconsumer:pull类型的consumer主动从broker获取消息。一旦获取到批量的消息,用户应用将会启动消费进程。

pushconsumer:push类型的consumer内部封装了消息获取,消费进度并且维护其他内部工作。留有一个回调接口,它在消息到达时被执行。

producer group:具有相同角色的producer的集合。在事务方面,当某个producer实例崩溃了,producer组中的任一个producer实例去连接broker实现事务的提交或者回滚。

consumer group:具有相同角色的consumer的集合。可以用于实现消息消费方面的负载平衡和容错。每个consumer实例必须有相同的topic订阅。

mssage model:两种:一种是clusting,一种是broadcasting。

message order:两种:一种是orderly,一种是concurrently。当使用了DefaultMQPushConsumer这个类时,可以指定消费消息的顺序。

3、架构,图片来源:http://rocketmq.apache.org/docs/rmq-arc/

4、支持的协议和规范

Pull model, support TCP, JMS, OpenMessaging

5、admin 命令行操作

1 ./mqadmin topicList -n 192.168.0.102:9876 #列出对应name server所有topic
2
3 ./mqadmin topicClusterList -n 192.168.0.102:9876 -t TopicTest #查询某topic对应的cluster,默认是DefaultCluster
4
5 ./mqadmin deleteTopic -c DefaultCluster -n 192.168.0.102:9876 -t TopicTest #通过指定cluster删除某个topic67 ./mqadmin printMsg -n 192.168.0.102:9876 -t TopicTest #打印某个topic的消息细节8 9 ./mqadmin consumeMessage -n 192.168.0.102:9876 -t TopicTest #消费指定topic的消息

6、java操作

maven依赖

 <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.11</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
             <version>2.6.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <version>2.6.3</version>
             <scope>test</scope>
         </dependency>

             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-client</artifactId>
                 <version>4.3.0</version>
                 <!--<version>4.3.0</version>-->
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-broker</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-common</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-store</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-namesrv</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-tools</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-remoting</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-logging</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-test</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-srvutil</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-filter</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-example</artifactId>
                 <version>4.3.0</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-api</artifactId>
                 <version>1.7.7</version>
             </dependency>
             <dependency>
                 <groupId>ch.qos.logback</groupId>
                 <artifactId>logback-classic</artifactId>
                 <version>1.0.13</version>
             </dependency>
             <dependency>
                 <groupId>ch.qos.logback</groupId>
                 <artifactId>logback-core</artifactId>
                 <version>1.0.13</version>
             </dependency>
             <dependency>
                 <groupId>commons-cli</groupId>
                 <artifactId>commons-cli</artifactId>
                 <version>1.2</version>
             </dependency>
             <dependency>
                 <groupId>io.netty</groupId>
                 <artifactId>netty-all</artifactId>
                 <version>4.0.42.Final</version>
             </dependency>
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>fastjson</artifactId>
                 <version>1.2.29</version>
             </dependency>
             <dependency>
                 <groupId>org.javassist</groupId>
                 <artifactId>javassist</artifactId>
                 <version>3.20.0-GA</version>
             </dependency>
             <dependency>
                 <groupId>net.java.dev.jna</groupId>
                 <artifactId>jna</artifactId>
                 <version>4.2.2</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-lang3</artifactId>
                 <version>3.4</version>
             </dependency>
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
                 <version>19.0</version>
             </dependency>
             <dependency>
                 <groupId>io.openmessaging</groupId>
                 <artifactId>openmessaging-api</artifactId>
                 <version>0.3.1-alpha</version>
             </dependency>
             <dependency>
                 <groupId>log4j</groupId>
                 <artifactId>log4j</artifactId>
                 <version>1.2.17</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.logging.log4j</groupId>
                 <artifactId>log4j-core</artifactId>
                 <version>2.7</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.logging.log4j</groupId>
                 <artifactId>log4j-slf4j-impl</artifactId>
                 <version>2.7</version>
             </dependency>
         </dependencies>

1)simple:参考:http://rocketmq.apache.org/docs/simple-example/

可以使用三种方式生产消息,分别是sync,async和one-way。使用到的关键类:org.apache.rocketmq.client.producer.DefaultMQProducer;

1  DefaultMQProducer producer = new DefaultMQProducer("test"); // test是组名,必须唯一
2  3  producer.setVipChannelEnabled(false);  //vip_port=109094
5  producer.setNamesrvAddr("localhost:9876"); //producer -> nameserver
6
7  producer.start();8 

三种方法关键的实现代码分别如下:

 1 //sync
 2 SendResult sendResult = producer.send(msg);
 3
 4 //async
 5  producer.send(msg, new SendCallback() {
 6                     @Override
 7                     public void onSuccess(SendResult sendResult) { }
 8                     @Override
 9                     public void onException(Throwable e) { }
10                 });
11
12 //one-way
13 producer.sendOneway(msg);14

注意:最后关闭producer。

消费消息:使用到的关键类:org.apache.rocketmq.client.consumer.DefaultMQPushConsumer

 1  DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test");
 2   3  consumer.setVipChannelEnabled(false); //vip_port=10909 4
 3  consumer.setNamesrvAddr("localhost:9876"); // consumer -> nameserver
 4
 5  consumer.subscribe("TopicTest", "*"); // 订阅 TopicTest
 6
 7  consumer.registerMessageListener(new MessageListenerConcurrently() { // 指定顺序concurrently
 8
 9             @Override
10             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
11
12                  return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
13             }
14         });

注意:最后关闭consumer。

2)order

3)broadcast

广播模式的关键代码:在BroadcastConsumer.java加入设置消息模式为BROADCASTING

1 //set to broadcast mode
2 consumer.setMessageModel(MessageModel.BROADCASTING);

4)schedule

调度模式的关键代码:在ScheduledMessageProducer.java设置延迟时间级别为3

1 // This message will be delivered to consumer 10 seconds later.
2 message.setDelayTimeLevel(3);

5)batch

如果发送的消息不超过1MiB,使用List装载Message。Mesage的topic相同。

如果复杂性高,不确定超过1MiB,通过实现接口 Iterator<List<Message>>以分割List<Message>

6)filter

可以使用sql表达式来选择消费的消息。支持数字比较,字符比较,逻辑运算,判断null等。

1 consumer.subscribe("TopicTest", MessageSelector.bySql("..."));

7)openmessage

8)transaction

生产消息,用到的关键类:org.apache.rocketmq.client.producer.TransactionMQProducer

生产者注册事务监听器:org.apache.rocketmq.client.producer.TransactionListener

生产者发送消息:TransactionMQProducer#sendMessageInTransaction

7、与spring整合

applicationContext-producer.xml

 <?xml version="1.0" encoding="utf-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx.xsd">

     <bean id="rocketmqProduct" class="org.apache.rocketmq.client.producer.DefaultMQProducer" >
          <property name="producerGroup" value="producer1"/>
          <property name="namesrvAddr" value="192.168.0.102:9876"/>
      </bean>
 </beans>

applicationContext-consumer.xml

 <?xml version="1.0" encoding="utf-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx.xsd">

      <bean id="myMessageListener" class="com.rui.spring.MyMessageListener" />

      <bean id="rocketmqConsumer" class="org.apache.rocketmq.client.consumer.DefaultMQPushConsumer">
             <property name="consumerGroup" value="consumer1"/>
             <property name="namesrvAddr" value="192.168.0.102:9876"/>
             <property name="messageListener" ref="myMessageListener"/>
             <property name="subscription">
                 <map>
                     <entry key="TopicTest">
                         <value>*</value>
                     </entry>
                 </map>
             </property>
      </bean>
 </beans>

MyMessageListener.java

 package com.rui.spring;

 import java.util.List;
 import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
 import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
 import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
 import org.apache.rocketmq.common.message.MessageExt;

 public class MyMessageListener implements MessageListenerConcurrently {
     public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
         System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);

         return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
     }
 }

9、源码(java客户端)

10、集群

rocketmq ----> 学习笔记的更多相关文章

  1. RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群

    1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...

  2. RocketMQ学习笔记(15)----RocketMQ的消息模式

    在前面学习ActiveMQ时,看到ActiveMQ可以是队列消息模式,也可以是订阅发布模式. 同样,在RocketMQ中,也存在两种消息模式,即是集群消费模式和广播消费模式. 1. 集群消费模式 跟A ...

  3. RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试

    1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...

  4. RocketMQ学习笔记(14)----RocketMQ的去重策略

    1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...

  5. RocketMQ学习笔记(4)----RocketMQ搭建双Master集群

    前面已经学习了RockeMQ的四种集群方式,接下来就来搭建一个双Master(2m)的集群环境. 1. 双Master服务器环境 序号 ip 用户名 密码 角色 模式 (1) 47.105.145.1 ...

  6. 2018/1/28 RocketMq学习笔记

    RocketMq是支持Topic模式的MQ中间件,它的传输格式为topic(主题,一个product对应一个主题,),Tag(标签,其实就是副标题,是为了更好的支持集群模式而出现的,这样客户端可以指定 ...

  7. RocketMQ学习笔记(一)eclipse版的quickstart

    学而时习之,不亦说乎! 自己搭建个学习用的RocketMQ总是很麻烦,需要虚拟机环境,网络,需要安装rocketmq,启动.时间久了再去看,又不知道这个虚拟机是干嘛的了. 直接在eclipse中启动, ...

  8. RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer

    1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...

  9. RocketMQ学习笔记(10)----RocketMQ的Producer 事务消息使用

    1. 事务消息原理图 RocketMQ除了支持普通消息,顺序消息之外,还支持了事务消息. 1. 什么是分布式事务? 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同 ...

随机推荐

  1. 转 消息中间件:RocketMQ 介绍(特性、术语、原理、优缺点、消息顺序、消息重复)

    https://blog.csdn.net/jiangyu1013/article/details/81668671 消息中间件的作用 1. 应用解耦 2. 异步处理 比如用户注册场景,注册主流程完成 ...

  2. 解决秒杀活动高并发出现负库存(Redis)

    商城在秒杀活动开始时,同时有好多人来请求这个接口,即便做了判断库存逻辑,也难免防止库存出现超卖,造成损失 Django中的ORM本身就对数据库做了防范,但再过亿级访问也扛不住 下面利用Redis的过载 ...

  3. 解决HTML5提出的新的元素不被IE6-8识别的解决办法

    解决HTML5提出的新的元素不被IE6-8识别的解决办法 <!--[if lt IE 9]> <script type="text/javascript" src ...

  4. Spring mvc下Ajax获取JSON对象问题 406错误

    spring 通过@ResponseBody标签返回JSON数据的方法都报406错: Failed to load resource: the server responded with a stat ...

  5. C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast

    关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...

  6. xampp lampp 改变网页root目录的方法

    This is an old question but I haven't seen it properly answered yet. Here is what you need to do: In ...

  7. abap test msg

  8. Spark Streaming之窗口函数和状态转换函数

    流处理主要有3种应用场景:无状态操作.window操作.状态操作. reduceByKeyAndWindow import kafka.serializer.StringDecoder import ...

  9. [js]作用域链查找规则获取值和设置值

    作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到windo ...

  10. Cloud-init

    cloud-init用于在创建虚拟机时通过元数据服务对虚拟机基本配置,包括常见的主机名,用户,密码等等.同时用户可以通过user_data自定义一些数据对虚拟机进行配置,可以有配置文件cloud-co ...