1.概念简介
Apache RocketMQ是一个采用Java语言开发的分布式的消息系统
- Producer 消息生产者,负责产生消息,一般由业务系统负责产生消息。
- Producer Group 一类 Producer 的集合名称,这类 Producer 通常发送一类消息,且发送逻辑一致。
- Consumer 消息费者,负责消费消息,一般是后台系统负责异步消费。
- Push Consumer 服务端向消费者端推送消息
- Pull Consumer 消费者端向服务定时拉取消息
- Consumer Group 一类 Consumer 的集合名称,这类 Consumer 通常消费一类消息,且消费逻辑一致。
- NameServer 集群架构中的组织协调员 收集broker的工作情况 不负责消息的处理
- Broker 是RocketMQ的核心负责消息的发送、接收、高可用等(真正干活的) 需要定时发送自身情况到NameServer,默认10秒发送一次,超时2分钟会认为该broker失效。
- Topic 不同类型的消息以不同的Topic名称进行区分,如User、Order等 是逻辑概念
- Message Queue 消息队列,用于存储消息
2.部署安装
这里介绍两种安装方式:
2.1非docker安装
下载地址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip
在文件目录,执行命令解压文件:
unzip rocketmq-all-4.3.2-bin-release.zip
进入文件bin目录,启动nameserver:
./mqnamesrv
发现启动报错:
启动错误,是因为内存不够,导致启动失败,原因:RocketMQ的配置默认是生产环境的配置,设置的jvm的内存大小值比较大,对于学习而言没有必要设置这么大,测试环境的内存往往都不是很大,所以需要调整默认值。
解决办法:
调整默认的内存大小参数:
在bin 目录 vim runserver.sh
将所有改为128m
vim runbroker.sh 同上
再次启动,不再报错
./mqnamesrv
-n 指定nameserver地址和端口
./mqbroker -n 172.16.185.55:9876
2.1.1编写JAVA代码进行测试
引入依赖:
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
编写代码:
public class SyncProducer {
public static void main(String[] args) throws Exception {
//Instantiate with a producer group name.
DefaultMQProducer producer = new
DefaultMQProducer("test-group");
// Specify name server addresses.
producer.setNamesrvAddr("172.16.55.185:9876");
//Launch the instance.
producer.start();
for (int i = 0; i < 100; i++) {
//Create a message instance, specifying topic, tag and message body.
Message msg = new Message("TopicTest11" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
//Call send message to deliver message to one of brokers.
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
} /
/Shut down once the producer instance is not longer in use.
producer.shutdown();
}
}
测试结果会发现,发送消息会报错。原因是什么呢?仔细观察broker启动的信息:
The broker[stylefeng, 172.17.0.1:10911] boot success. serializeType=JSON and name server
is 172.16.185.55:9876
会发现,broker的ip地址是172.17.0.1,那么在开发机上是不可能访问到的。所以,需要指定broker的ip地址。
#进入文件conf目录 创建broker配置文件
vim broker.conf
brokerIP1=172.16.55.185
namesrvAddr=172.16.55.185:9876
brokerName=broker_haoke_im
#启动broker,通过 -c 指定配置文件
./mqbroker -c /rmqbroker/conf/broker.conf
The broker[stylefeng, 172.16.55.185:10911] boot success. serializeType=JSON and name
server is 172.16.55.185:9876 #这样就可以进行访问了
2.2docker安装
#拉取镜像