RocketMQ实战(一)

作者: 张丰哲 | 来源:发表于2017-04-08 21:37 被阅读35460次

    阿里巴巴有2大核心的分布式技术,一个是OceanBase,另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大,本人计划写一个RocketMQ实战系列,将涵盖RocketMQ的简介,环境搭建,初步使用、API详解、架构分析、管理员集群操作等知识。

    What is RocketMQ?

    RocketMQ作为一款分布式的消息中间件(阿里的说法是不遵循任何规范的,所以不能完全用JMS的那一套东西来看它),经历了Metaq1.x、Metaq2.x的发展和淘宝双十一的洗礼,在功能和性能上远超ActiveMQ。

    1.要知道RocketMQ原生就是支持分布式的,而ActiveMQ原生存在单点性。

    2.RocketMQ可以保证严格的消息顺序,而ActiveMQ无法保证!

    3.RocketMQ提供亿级消息的堆积能力,这不是重点,重点是堆积了亿级的消息后,依然保持写入低延迟!

    4.丰富的消息拉取模式(Push or Pull)

    Push好理解,比如在消费者端设置Listener回调;而Pull,控制权在于应用,即应用需要主动的调用拉消息方法从Broker获取消息,这里面存在一个消费位置记录的问题(如果不记录,会导致消息重复消费)。

    5.在Metaq1.x/2.x的版本中,分布式协调采用的是Zookeeper,而RocketMQ自己实现了一个NameServer,更加轻量级,性能更好!

    6.消息失败重试机制、高效的订阅者水平扩展能力、强大的API、事务机制等等(后续详细介绍)


    初步理解Producer/Consumer Group

    ActiveMQ中并没有Group这个概念,而在RocketMQ中理解Group的机制很重要。

    Group机制

    想过没有,通过Group机制,让RocketMQ天然的支持消息负载均衡!

    比如某个Topic有9条消息,其中一个Consumer Group有3个实例(3个进程 OR 3台机器),那么每个实例将均摊3条消息!(注意RocketMQ只有一种模式,即发布订阅模式。)


    install RocketMQ

    RocketMQ的Broker集群部署模式还挺多的,比如单Master模式、多Master模式、多Master多Slave模式(异步复制)、多Master多Slave模式(同步双写)等。明确个概念,RocketMQ Slave不可以写,可以读,类似于MySQL的主从机制。

    单Master模式:

    无需多言,一旦单个broker重启或宕机,一切都结束了!很显然,线上不可以使用。

    多Master模式:

    全是Master,没有Slave。当然,一个broker宕机了,应用是无影响的,缺点在于宕机的Master上未被消费的消息在Master没有恢复之前不可以订阅。

    多Master多Slave模式(异步复制):

    多对Master-Slave,高可用!采用异步复制的方式,主备之间短暂延迟,MS级别。Master宕机,消费者可以从Slave上进行消费,不受影响,但是Master的宕机,会导致丢失掉极少量的消息。

    多Master多Slave模式(同步双写):

    和上面的区别点在于采用的是同步方式,也就是在Master/Slave都写成功的前提下,向应用返回成功,可见不论是数据,还是服务都没有单点,都非常可靠!缺点在于同步的性能比异步稍低。

    这里我将采用2个Master的方式进行搭建演示,会了双Master,其他的将很简单。(多Master在实际中也是非常常用的,如果并发非常大,考虑多Master多Slave模式)

    双Master模式架构

    在192.168.99.121/122机器上各一个NameServer、Master进程。

    以192.168.99.121为例:

    第一步,修改/etc/hosts文件

    hosts配置 确保相互之间可以ping通

    第二步,解压并创建存储路径

    tar -xvf alibaba-rocketmq-3.2.6.tar.gz

    mkdir -p alibaba-rocketmq/store/{commitlog,consumequeue,index}

    第三步,配置文件

    broker-x.properties 配置项

    上面已经将实际中常用的配置项给出来了!

    第四步,修改日志配置文件

    注意到logback.*.xml配置文件中:

    需要替换${user.name}

    可以使用sed进行替换:

    sed -i 's#${user.home}#/software/alibaba-rocketmq#g' *.xml

    第五步,修改启动脚本中的JVM参数

    vim runbroker.sh/rumserver.sh

    注意,在这里我将JVM的堆的初始化和最大大小统一设置为1G,并将新生代大小设置为512M。主要是考虑到我的虚拟机内存,实际上在线上是可以走默认的4G堆内存的。

    第六步,启动NameServer

    nohup sh mqnamesrv &

    NameServer nameserver启动日志

    第七步,启动broker-X

    启动broker

    注意观察日志:

    broker.log 进程与端口

    第八步:RocketMQ Console

    把rocketmq-console.war部署到Tomcat下即可。

    解压WAR包 在解压WAR包后的CLASS下更改config.properties 好久不见,TOM猫 rocketmq管控台

    这个管控台实际上还是比较简陋的,我们使用比较多的是mqadmin操作命令,后续会介绍。

    OK,到这里,双Master的搭建已经完成了!

    本篇博客到此为止,下期再见,晚安!

    相关文章

      网友评论

      • ccccmatser:请问单机部署主从节点时,NameServer也需要配置两个吗?
      • LXPSTUDIO:如果3个Master,就在2m-noslave里面再复制一个属性文件,重命名为broker-3.properties?
      • 266c7b31c70f:第三步,配置文件 配置文件有问题了
        张丰哲:嗯嗯,谢谢指出,😄
      • 266c7b31c70f:namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876是不是应该是

        namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876啊?
        张丰哲:嗯,写法和hosts配置的有关系,谢谢~
      • 266c7b31c70f:可以使用sed进行替换:sed -i 's#${user.home}#/software/alibaba-rocketmq#g' *.xml 没看懂
      • 翁zY同学Puzzle:刚接触RocketMq ,想问如何清空持久化的消息?消息存储的文件位置在哪里配置
        张丰哲:你可以查询下阿里的rmq清空消息的命令支持哈。
      • 暂不存在:请问你的RocketMQ实战(二)这个有源码吗?
      • Anson前行:楼主写的很明白 受教了 请教下线上可以直接这样配置吗? 3.36可以用rocketmq-console-ng吗? 最好把war包部署到tomcat下一直访问不到什么原因啊 大佬
        张丰哲:线上的话,你可以咨询下你们公司的运维哈,访问不到估计是网络端口权限的问题哈
      • dfec7f240224:谢谢,很详细,
      • bc6e1bdde6ff:《RocketMQ实战(一) - 简书》写的不错不错,收藏了。

        推荐下,分布式队列中间件 RocketMQ 源码解析 14 篇:http://tinyurl.com/yb7qqc8l


        张丰哲:@逄尾 :blush:
        8afe04d66ee7:写的非常六六六啊

        加油!
      • 黑白蓝调:哈哈,作为小白,你这文章没有写需要的环境,应该需要maven 而且你那个JDK的配置对于JDK8是没有任何意义的~
        张丰哲:嗯嗯,谢谢指出,😄
      • ee52e4e2c441:赞!大神你好,请问broker-a.properties,broker-b.properties这两个文件都要配置吗,内容也是一样的吗,另一台也是一样的配置吗?谢谢
        张丰哲:@少女亮兵器吧 你的这种情况,我倒是没有遇到过。你的JDK环境变量设置了么?
        ee52e4e2c441:@张丰哲 你好!请教下 我照着文章安装了,启动nameserver的时候报错:找不到jdk和无法加载 com.alibaba.rocketmq.namesrv.NamesrvStartup 类,jdk 已经安装了 ,您遇到过这种情况吗?谢谢了
        张丰哲:恩,在实际中,2者最好一致,然后不同的broker启动对应的配置文件即可。:smiley:
      • 38cf9b268464:看完后就是一个赞,多谢分享,最近也在看,希望能和楼主多交流。
        张丰哲:一般出现这个问题,都是配置文件的配置,以及启动方式错误导致的。可以仔细参考楼主这块的说明。:blush:
        facetoface_bd06:首先非常感谢笔者能把这些贡献出来,很详情,但是我在启动broker的时候跑异常了,一下为部分异常堆栈信息:
        2017-06-18 19:20:33 INFO main - join thread PullRequestHoldService eclipse time(ms) 0 90000
        2017-06-18 19:20:33 WARN main - unregisterBroker Exception, 192.168.238.131:9876
        com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.238.131:9876> failed
        at com.alibaba.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:641) ~[rocketmq-remoting-3.2.6
        .jar:na]

        不知道这个异常怎么出路,我虚拟机配置是:4核,1g内存,谢谢了!!!
        张丰哲:好的,相互交流,共同进步~
      • thinkhejie:RocketMQ Console 在哪里能下载 ?
        张丰哲:网上有很多地方可以下载的,你可以搜索下“RocketMQ Console download”,:blush:
      • 123_19f0:2017-05-21 08:15:55 INFO main - load exist local topic, TopicConfig [topicName=DefaultCluster, readQueueNums=16, writeQueueNums=16, perm=RWX, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false]
        2017-05-21 08:15:55 INFO main - load exist local topic, TopicConfig [topicName=register_topic, readQueueNums=4, writeQueueNums=4, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false]
        2017-05-21 08:15:55 INFO main - load /root/store/config/topics.json OK
        2017-05-21 08:15:55 INFO main - load /root/store/config/consumerOffset.json OK
        2017-05-21 08:15:55 INFO main - load /root/store/config/delayOffset.json OK
        2017-05-21 08:15:55 INFO main - shutdown thread PullRequestHoldService interrupt false
        2017-05-21 08:15:55 INFO main - join thread PullRequestHoldService eclipse time(ms) 1 90000
        2017-05-21 08:15:55 WARN main - unregisterBroker Exception, 192.168.1.111:9876
        com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.1.111:9876> failed
        at com.alibaba.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:641) ~[rocketmq-remoting-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.out.BrokerOuterAPI.unregisterBroker(BrokerOuterAPI.java:228) ~[rocketmq-broker-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.out.BrokerOuterAPI.unregisterBrokerAll(BrokerOuterAPI.java:252) ~[rocketmq-broker-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.BrokerController.unregisterBrokerAll(BrokerController.java:515) [rocketmq-broker-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.BrokerController.shutdown(BrokerController.java:488) [rocketmq-broker-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:229) [rocketmq-broker-3.2.6.jar:na]
        at com.alibaba.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:78) [rocketmq-broker-3.2.6.jar:na]
        ^C
        [root@bogon rocketmqlogs]# ^C
        这个是什么情况啊 broker 启动报错
        laungcisin:把防火墙关了
        赤子心_d709:runbroker配置的xms xmx xmn改小一点
        张丰哲:我这边也遇到过启动错误,都是配置错误导致的,可以参照楼主的检查一下~
      • Lelontar:支持!!!
        张丰哲:谢谢~
      • dombool: 问一个问题,阿里的alibaba-rocketmq 是现在可以在生产使用的发布版本,而捐赠给apache的Apache RocketMQ还在孵化中?我有点不确定
        张丰哲:@dombool 维护、稳定性这个得阿里的RMQ团队来说,:smiley:
        dombool:@张丰哲 alibaba-rocketmq 3.2.6? 效果如何呢,维护,稳定性
        张丰哲:我这边也是工作接触过3.2.6,据说阿里内部到了4.X,不过3.2.6是稳定版本的。至于孵化中的项目还不太了解具体信息,:smiley:
      • 虚拟机:关注了此系列
      • Brent姜:👍有没有和RabbitMQ性能的对比结果?
        dombool:问一个问题,阿里的alibaba-rocketmq 是现在可以在生产使用的发布版本,而捐赠给apache的Apache RocketMQ还在孵化中?我有点不确定
        Brent姜: @孟志林 了解了,谢谢啦
        张丰哲:@孟志林 在工作中没有接触过RabbitMQ,不过RocketMQ参考了RabbitMQ,性能上应该不低于它,:smiley:
      • c87c81859066:JVM的堆的初始化和最大大小 是根据什么设置啊?
        我的服务器8核,16G
        张丰哲:RocketMQ的最小堆内存至少1G,默认情况下是4G,当然根据你的服务器内存使用情况,多分配点,设置初始堆、最大堆为相同大小是比较好的情况。
      • DesertSnow:我先评论下,再来看这篇博文:wink: :wink: :wink:
        张丰哲:@DesertSnow :blush:
      • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/5q777y 欢迎点赞支持!
        欢迎订阅《程序员技术圈》https://toutiao.io/subject/4849
        张丰哲:@开发者头条_程序员必装的App :smile:
      • 闪电是只猫:坚持写下去啊,我还等着看呢😅
        张丰哲:@ideabuffer no problem
      • 艾逸涵:支持楼主分享出来
        张丰哲:@艾逸涵 :smile:

      本文标题:RocketMQ实战(一)

      本文链接:https://www.haomeiwen.com/subject/tcmlattx.html