一、安装与配置
下载
官网:http://rocketmq.apache.org/
如:rocketmq-all-4.0.0-incubating-bin-release.zip
解压文件之后,目录结构如下
-rocketmq
- LICENSE
- NOTICE
- README.md
- benchmark
- bin
- conf
- 2m-2s-async // 多master异步复制模式
- 2m-noslave // 多master无slave模式
- 2m-2s-sync // 多master同步复制模式
- lib
可以看到上面的文件文件解压之后,在conf文件夹里面存在2m-noslave、2m-2s-async、2m-2s-sync文件夹 ,
2m-noslave 两主,无从的配置
2m-2s-async 两主,两从,同步复制数据的配置
2m-2s-sync 两主,两从,异步复制数据的配置
跑demo的话,用这个里面的就可以直接玩玩了。
broker配置文件详解
# 默认的集群名称
brokerClusterName=DefaultCluster
# broke名称
brokerName=broker-a
# Broker 对外服务的监听端口
listenPort=10911
# 0为master, 大于0的为slave
brokerId=0
# 删除文件时间点,默认凌晨 4点 ,PS : 在每天的什么时间删除已经超过文件保留时间的 commit log
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE 从机
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
# broker IP地址
brokerIP1=localhost
# nameServer地址,分号分割
namesrvAddr=localhost:9876
# 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# 存储 commit log 的路径
storePathCommitLog = /app/rocketmq/stroe/commitlog
#存储 consume queue 的路径
storePathConsumerQueue = /app/rocketmq/stroe/commitlog
# commit log 的映射文件大小
mapedFileSizeCommitLog = 1024 * 1024 * 1024
配置启动
rocketMq默认的内存配置占用内存比较大,因此,需要修改一下启动参数
修改broker启动参数
修改nameServer启动参数
启动命令
启动nameSrv
nohup sh mqnamesrv > /app/rocketmq/logs/mqnamesrv.log 2>&1 &
查看/app/rocketmq/logs/mqnamesrv.log日志
Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file /dev/shm/rmq_srv_gc.log due to No such file or directory
Java HotSpot(TM) 64-Bit Server VM warning: MaxNewSize (131072k) is equal to or greater than the entire heap (131072k). A new max generation size of 131008k will be used.
The Name Server boot success. serializeType=JSON
启动broker
nohup sh ./mqbroker -c /app/rocketmq/conf/2m-2s-async/broker-a.properties > /app/rocketmq/logs/broker-a.log 2>&1 &
查看/app/rocketmq/logs/broker-a.log日志
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file /dev/shm/mq_gc_pid22422.log due to No such file or directory
The broker[broker-a, localhost:10911] boot success. serializeType=JSON and name server is localhost:9876
关闭命令
# 关闭borker
sh ./mqshutdown broker
# 关闭nameSrv
sh ./mqshutdown namesrv
简单测试
消费者
public class ConsumerTest {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
// 设置生产者组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("my_producer_group");
// 设置NameServer地址
consumer.setNamesrvAddr("localhost:9876");
// 订阅的主题
consumer.subscribe("MyTopic", "*");
// 注册消息监听
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
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");
}
}
生产者
public class ProducerTest {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
// 设置生产者组名
DefaultMQProducer producer = new DefaultMQProducer("my_producer_group");
// 设置NameServer地址
producer.setNamesrvAddr("localhost:9876");
// 启动
producer.start();
for (int i = 0; i < 5; i++) {
// 创建一条消息,包含topic、tag以及消息内容
Message msg = new Message("MyTopic", "MyTag", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 发送结果
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
Thread.sleep(50);
}
// 不用的时候关闭
producer.shutdown();
}
}
分别启动生产者和消费者
生产者日志
16:29:33.569 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
SendResult [sendStatus=SEND_OK, msgId=0AD0C99C67F118B4AAC26562D19D0000, offsetMsgId=7F00000100002A9F0000000001140F64, messageQueue=MessageQueue [topic=MyTopic, brokerName=broker-a, queueId=3], queueOffset=25002]
SendResult [sendStatus=SEND_OK, msgId=0AD0C99C67F118B4AAC26562D1E90001, offsetMsgId=7F00000100002A9F0000000001141015, messageQueue=MessageQueue [topic=MyTopic, brokerName=broker-a, queueId=0], queueOffset=25002]
SendResult [sendStatus=SEND_OK, msgId=0AD0C99C67F118B4AAC26562D2350002, offsetMsgId=7F00000100002A9F00000000011410C6, messageQueue=MessageQueue [topic=MyTopic, brokerName=broker-a, queueId=1], queueOffset=25003]
SendResult [sendStatus=SEND_OK, msgId=0AD0C99C67F118B4AAC26562D2720003, offsetMsgId=7F00000100002A9F0000000001141177, messageQueue=MessageQueue [topic=MyTopic, brokerName=broker-a, queueId=2], queueOffset=25003]
16:29:35.635 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:10911] result: true
16:29:35.639 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:10911] result: true
16:29:35.640 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
消费者日志
Consumer Started.
ConsumeMessageThread_1 Receive New Messages: [MessageExt [queueId=3, storeSize=177, queueOffset=25002, sysFlag=0, bornTimestamp=1568968175007, bornHost=/127.0.0.1:55037, storeTimestamp=1568968175023, storeHost=/127.0.0.1:10911, msgId=7F00000100002A9F0000000001140F64, commitLogOffset=18091876, bodyCRC=613185359, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='MyTopic', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=25003, CONSUME_START_TIME=1568968175082, UNIQ_KEY=0AD0C99C67F118B4AAC26562D19D0000, WAIT=true, TAGS=MyTag}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 48], transactionId='null'}]]
ConsumeMessageThread_2 Receive New Messages: [MessageExt [queueId=0, storeSize=177, queueOffset=25002, sysFlag=0, bornTimestamp=1568968175081, bornHost=/127.0.0.1:55037, storeTimestamp=1568968175105, storeHost=/127.0.0.1:10911, msgId=7F00000100002A9F0000000001141015, commitLogOffset=18092053, bodyCRC=1401636825, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='MyTopic', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=25003, CONSUME_START_TIME=1568968175118, UNIQ_KEY=0AD0C99C67F118B4AAC26562D1E90001, WAIT=true, TAGS=MyTag}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 49], transactionId='null'}]]
ConsumeMessageThread_3 Receive New Messages: [MessageExt [queueId=1, storeSize=177, queueOffset=25003, sysFlag=0, bornTimestamp=1568968175157, bornHost=/127.0.0.1:55037, storeTimestamp=1568968175158, storeHost=/127.0.0.1:10911, msgId=7F00000100002A9F00000000011410C6, commitLogOffset=18092230, bodyCRC=1250039395, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='MyTopic', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=25004, CONSUME_START_TIME=1568968175167, UNIQ_KEY=0AD0C99C67F118B4AAC26562D2350002, WAIT=true, TAGS=MyTag}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 50], transactionId='null'}]]
ConsumeMessageThread_4 Receive New Messages: [MessageExt [queueId=2, storeSize=177, queueOffset=25003, sysFlag=0, bornTimestamp=1568968175218, bornHost=/127.0.0.1:55037, storeTimestamp=1568968175223, storeHost=/127.0.0.1:10911, msgId=7F00000100002A9F0000000001141177, commitLogOffset=18092407, bodyCRC=1032136437, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='MyTopic', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=25004, CONSUME_START_TIME=1568968175228, UNIQ_KEY=0AD0C99C67F118B4AAC26562D2720003, WAIT=true, TAGS=MyTag}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 51], transactionId='null'}]]
看到上面的日志,其实一个非常简单的rocketMq的生产者消费者模型就搭建好了
rocketMq最佳实践
官方提供的一些最佳实践,写的很棒,一般没啥特别要求的,使用这个配置基本上就没啥问题
https://github.com/apache/rocketmq/blob/master/docs/cn/best_practice.md
结语
今天只是非常简单的介绍了一下rocketMq的单机版,一个非常入门级别的教程,后面会写一点深入rocketMq源码分析的文章
http://weixin.qq.com/r/eC-YwJDE7s2RrdSj93pq (二维码自动识别)
笔者微信号: