1 简介
1.1 官方说明:
RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
1、支持严格的消息顺序
2、支持Topic与Queue两种模式
3、亿级消息堆积能力
4、比较友好的分布式特性
5、同时支持Push与Pull方式消费消息
1.2 基本概念
看完其实还是不懂,所以我们先了解几个基本概念:
Producer | 消息生产者,负责产生消息,一般由业务系统负责产生消息 |
Consumer | 消息消费者,负责消费消息,一般是后台系统负责异步消费 |
Push Consumer | Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法 |
Pull Consumer | Consumer的一种,应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制 |
Producer Group | 一类Producer的集合名称,这类Producer通常发送一类消息,且发送逻辑一致 |
Consumer Group | 一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致 |
Broker | 消息中转角色,负责存储消息,转发消息,一般也称为Server。 |
长连接 | 在页面嵌入一个隐藏的Iframe,将这个隐藏Iframe的src属性设置为对一个长连接的请求或是采用xhr请求,服务器端就源源不断的向客户端输入数据。 |
还是晕乎乎,于是继续往下看……
1.3 网络部署
我们先看RocketMQ的网络部署图:
(1)NameServer是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步。
(2)Broker部署相对复杂:
a) Broker分为Master与Slave。
b)一个Master可以对应多个Slaver,但是一个Slaver只能对应一个Master。
(3)Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。
(4)Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slaver建立长连接,且定时向Master、Slaver发送心跳。Consumer既可从Master订阅消息,也可从Slave订阅消息,订阅规则由Broker配置决定
先有这么个初步印象吧,其实楼主也没太懂,我们可以先单机部署一下,在实践中学习~
2 环境搭建
首先,下面的安装部署基于Linux系统环境:Ubuntu 14.04(64位),其他Linux版本可能有所差异
安装步骤:
2.1 安装git环境
apt-get install git-core
2.2 安装Java环境
保证JDK是64位的,楼主用的jdk-8u5-linux-x64.tar.gz,解压,并在/etc/profile文件末尾添加环境变量,如下:
export JAVA_HOME=/usr/local/java/jdk1.8.0_05
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
测试
java -v
成功
2.3 安装Maven环境
下载Maven包,楼主用的apache-maven-3.2.2-bin.tar.gz,解压,配置环境变量
<pre name="code" class="html">export M2_HOME=/usr/local/java/apache-maven-3.2.2
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
测试
mvn -v
成功
注意:网上说source /etc/profile就可以立即生效,但是我重新开一个shell后,新配置的环境变量还是没反应,所以还是注销再重新登录好了。
2.4 部署RocketMQ Demo
首先下载RocketMQ,地址:https://github.com/alibaba/RocketMQ/releases
也可以去https://git.oschina.net/vintagewang/RocketMQ/attach_files,速度快一点
解压,进入bin目录,
启动Name Server
nohup sh mqnamesrv &
启动Broker、Producer、Consumer之前请设置环境变量
export NAMESRV_ADDR=127.0.0.1:9876
启动Broker
nohup sh mqbroker &
测试 jps 看到
3232 Jps
2828 NamesrvStartup
2988 BrokerStartup
就ok了
然后尝试收发消息,Github上有给simple example,首先在IDEA里创建Maven项目,将Producer.java和Consumer.java拷进去,配置pom.xml如下,除了junit,只要rocketmq-client就够了,官网上的那个pom.xml各种找不到=。=
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.catt</groupId>
<artifactId>RocketMQTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>RocketMQTest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
运行Producer.java,看到
SendResult [sendStatus=SEND_OK, msgId=C0A8858200002A9F00000000000006F4,messageQueue=MessageQueue [topic=TopicTest1, brokerName=ubuntu, queueId=0],queueOffset=4]
SendResult [sendStatus=SEND_OK,msgId=C0A8858200002A9F0000000000000788, messageQueue=MessageQueue[topic=TopicTest2, brokerName=ubuntu, queueId=0], queueOffset=4]
SendResult [sendStatus=SEND_OK,msgId=C0A8858200002A9F000000000000081D, messageQueue=MessageQueue[topic=TopicTest3, brokerName=ubuntu, queueId=0], queueOffset=4]
运行
PushConsumer.java
看到
Consumer Started.
ConsumeMessageThread_1 Receive New Messages: [MessageExt[queueId=0, storeSize=148, queueOffset=3, sysFlag=0,bornTimestamp=1404989616793, bornHost=/192.168.133.130:57879,storeTimestamp=1404989616817, storeHost=/192.168.133.130:10911,msgId=C0A8858200002A9F0000000000000537, commitLogOffset=1335,bodyCRC=1751783629, reconsumeTimes=0, preparedTransactionOffset=0,toString()=Message [topic=TopicTest1, flag=0, properties={MIN_OFFSET=0,MAX_OFFSET=4, KEYS=OrderID001, WAIT=true, TAGS=TagA}, body=11]]]
ConsumeMessageThread_2 Receive New Messages: [MessageExt[queueId=0, storeSize=149, queueOffset=3, sysFlag=0,bornTimestamp=1404989616831, bornHost=/192.168.133.130:57879,storeTimestamp=1404989616834, storeHost=/192.168.133.130:10911,msgId=C0A8858200002A9F00000000000005CB, commitLogOffset=1483,bodyCRC=1751783629, reconsumeTimes=0, preparedTransactionOffset=0,toString()=Message [topic=TopicTest2, flag=0, properties={MIN_OFFSET=0,MAX_OFFSET=4, KEYS=OrderID0034, WAIT=true, TAGS=TagB}, body=11]]]
ConsumeMessageThread_3 Receive New Messages: [MessageExt[queueId=0, storeSize=148, queueOffset=4, sysFlag=0,bornTimestamp=1404989927077, bornHost=/192.168.133.130:57899,storeTimestamp=1404989927096, storeHost=/192.168.133.130:10911,msgId=C0A8858200002A9F00000000000006F4, commitLogOffset=1780,bodyCRC=1751783629, reconsumeTimes=0, preparedTransactionOffset=0,toString()=Message [topic=TopicTest1, flag=0, properties={MIN_OFFSET=0,MAX_OFFSET=5, KEYS=OrderID001, WAIT=true, TAGS=TagA}, body=11]]]
ConsumeMessageThread_4 Receive New Messages: [MessageExt[queueId=0, storeSize=149, queueOffset=4, sysFlag=0,bornTimestamp=1404989927117, bornHost=/192.168.133.130:57899,storeTimestamp=1404989927118, storeHost=/192.168.133.130:10911,msgId=C0A8858200002A9F0000000000000788, commitLogOffset=1928,bodyCRC=1751783629, reconsumeTimes=0, preparedTransactionOffset=0,toString()=Message [topic=TopicTest2, flag=0, properties={MIN_OFFSET=0,MAX_OFFSET=5, KEYS=OrderID0034, WAIT=true, TAGS=TagB}, body=11]]]
至此,
demo
部署成功,之后就漫漫长路了
……
3 参考资料
http://blog.csdn.net/alaxing5/article/details/24744789
http://www.changeself.net/archives/category/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6