rocketmq ----> 学习笔记
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 ----> 学习笔记的更多相关文章
- RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群
1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...
- RocketMQ学习笔记(15)----RocketMQ的消息模式
在前面学习ActiveMQ时,看到ActiveMQ可以是队列消息模式,也可以是订阅发布模式. 同样,在RocketMQ中,也存在两种消息模式,即是集群消费模式和广播消费模式. 1. 集群消费模式 跟A ...
- RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试
1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...
- RocketMQ学习笔记(14)----RocketMQ的去重策略
1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...
- RocketMQ学习笔记(4)----RocketMQ搭建双Master集群
前面已经学习了RockeMQ的四种集群方式,接下来就来搭建一个双Master(2m)的集群环境. 1. 双Master服务器环境 序号 ip 用户名 密码 角色 模式 (1) 47.105.145.1 ...
- 2018/1/28 RocketMq学习笔记
RocketMq是支持Topic模式的MQ中间件,它的传输格式为topic(主题,一个product对应一个主题,),Tag(标签,其实就是副标题,是为了更好的支持集群模式而出现的,这样客户端可以指定 ...
- RocketMQ学习笔记(一)eclipse版的quickstart
学而时习之,不亦说乎! 自己搭建个学习用的RocketMQ总是很麻烦,需要虚拟机环境,网络,需要安装rocketmq,启动.时间久了再去看,又不知道这个虚拟机是干嘛的了. 直接在eclipse中启动, ...
- RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer
1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...
- RocketMQ学习笔记(10)----RocketMQ的Producer 事务消息使用
1. 事务消息原理图 RocketMQ除了支持普通消息,顺序消息之外,还支持了事务消息. 1. 什么是分布式事务? 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同 ...
随机推荐
- DM
Chapter1 propositon Logic 1.1propositon A declarative sentence With a unique value. A proposition ca ...
- 移动前端开发和 Web 前端开发的区别
http://www.itcast.cn/news/20180125/16033584753.shtml 1,普通PC端开发与移动端开发区别. 先说背景,我大言不惭的说一下,我pc端的前端开发干了有快 ...
- python练习题-day8
1.有如下文件,a1.txt,里面的内容为: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并打印. wi ...
- 【JVM】-NO.116.JVM.1 -【JDK11 HashMap详解-5-红黑树】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 八、UIViewController们之间的协作——Segue
概述 正所谓“一生二,二生三,三生万物”,1个UIViewController没什么花样,多个UIViewController相互协作就有了各式各样丰富多彩的APP.但是UIViewControlle ...
- mint-ui Toast icon 图标
Toast({ message: '修改成功', iconClass: 'fa fa-check fa-5x' }); Toast({ message: '修改失败', iconClass: 'fa ...
- .NET Core 全新认识(转载)
.NET Core 全新认识 cnblogs.com/yubinfeng/p/6626694.html 一.概述 .NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨 ...
- rsync 远程同步 实时同步备份 两种免交互的方式实现实时备份
rsync 远程同步: 一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步 作用:做数据备份 备份方式: 完全备份 增量备份 ...
- liteos 从入门到放弃
这两天收到一份sdk,hisi 3516cv200 liteos的sdk 正好手头有硬件,就随便编译玩玩. 解压sdk. Hi3518E_SDK_V5.0.5.0 ll@ubuntu:~/work20 ...
- Docker Kubernetes 服务发现原理详解
Docker Kubernetes 服务发现原理详解 服务发现支持Service环境变量和DNS两种模式: 一.环境变量 (默认) 当一个Pod运行到Node,kubelet会为每个容器添加一组环境 ...