1.专业术语
分布式开放消息系统(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
参考官网:http://rocketmq.apache.org/docs/quick-start/
步骤如下:
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 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();
}
}