本来是想写RocketMQ系列博文第一篇RocketMQ简介,大致内容包括介绍什么是RocketMQ以及教大家如何安装RocketMQ的。但是呢?有网友说,学习RocketMQ官网特别难。
博主本着天下没有难学的技术,带领大家一起手撕RocketMQ。对于技术人员来说,官网才是第一手资料,解决所有棘手问题的起点,也是终点。
学习任何一项技术的通用步骤,三个W,解决所有问题:
1、首先,问What,了解学习这项技术是干嘛的,能够解决现实项目中的什么问题?
2、其次,问How,怎么做,如何下载(找到github),安装,编写简单的HelloWorld,进行实践
3、最终,问Why,为什么要这么做,原理是什么,架构是什么样的?
下面我们就用上面的3个W,手撕RocketMQ官网。
我们找到RocketMQ官网地址:https://rocketmq.apache.org/。
首先,介绍了设计RocketMQ的动机以及原因。阿里初期的消息队列使用的ActiveMQ,随着使用了越来越来的队列和虚拟主题,遇到了ActiveMQ的IO瓶颈。通过节流,断路器或降级等方案,尝试解决问题,但是效果不好。于是研究其他替代方案,但是kafka在低延迟和高可靠性方面不能满足阿里的业务需求,于是设计了RocketMQ。
官网对RocketMQ,ActiveMQ和Kafka三款MQ产品进行了简单的对比,内容如下:
下表展示了RocketMQ,ActiveMQ和Kafka(Apache最流行的消息传递解决方案)之间的比较:
MQ产品 | 客户端 SDK | 协议和规范 | 有序消息 | 定时消息 | 批处理消息 | 广播消息 | 消息过滤 | 消息重发 | 消息存储 | 消息回溯 | 消息优先级 | 高可用性和故障转移 | 消息轨迹 | 配置 | 管理和操作工具 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | Java, .NET, C++ 等 | 推模式,支持 OpenWire,STOMP, AMQP, MQTT, JMS | 独立消费或独立队列可以保证消息有序 | 支持 | 不支持 | 支持 | 支持 | 不支持 | 使用JDBC以及高性能日志(例如levelDB,kahaDB)支持非常快速的持久性 | 支持 | 支持 | 支持, 依赖存储,如果使用levelDB 则需要ZooKeeper | 不支持 | 默认配置为低级别,用户需要优化配置参数 | 支持 |
Kafka | Java, Scala 等 | 拉模式,支持 TCP | 保证独立分区内消息的有序性 | 不支持 | 支持(通过异步生产者) | 不支持 | 支持, 可以使用Kafka Streams 过滤消息 | 不支持 | 高性能文件存储 | 支持按照偏移量表示 | 不支持 | 支持, 需要ZooKeeper | 不支持 | Kafka使用键值对格式进行配置。这些值可以从文件或以编程方式提供。 | 支持,使用终端命令公开核心指标 |
RocketMQ | Java, C++, Go | 拉模式, 支持TCP,JMS, OpenMessaging | 严格确保消息有序,并可以优雅的扩展 | 支持 | 支持,同步模式以避免消息丢失 | 支持 | 支持, 基于SQL92的属性过滤器表示式 | 支持 | 高性能和低延迟的文件存储 | 支持,使用时间戳和偏移量两个指标表示 | 不支持 | 支持, 主从模式,无需其他插件 | 支持 | 开箱即用,用户只需要注意一些配置 | 支持,丰富Web和终端命令可显示核心指标 |
在快速开启中,RocketMQ为我们提供了中文的学习文档,https://github.com/apache/rocketmq/tree/master/docs/cn
学习RocketMQ需要5个先前条件。
我们既可以通过下载源码编译的方式,进行构建,部署,也可以从下载链接中直接下载已经构建好的工具包进行部署。
> unzip rocketmq-all-4.8.0-source-release.zip
> cd rocketmq-all-4.8.0/
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/target/rocketmq-4.8.0/rocketmq-4.8.0
# 1.启动NameServer
> nohup sh bin/mqnamesrv &
# 2.查看启动日志
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
# 1.启动Broker
> nohup sh bin/mqbroker -n localhost:9876 &
# 2.查看启动日志
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
首先要设置环境变量NAMESRV_ADDR
# 1.设置环境变量
> export NAMESRV_ADDR=localhost:9876
# 2.使用安装包的Demo发送消息
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
# 3.接收消息
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
# 1.关闭Broker
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
# 2.关闭NameServer
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
下载最新的二进制版本。并将zip文件解压缩到本地磁盘中。如:D:\rocketmq
ROCKETMQ_HOME="D:\rocketmq"
NAMESRV_ADDR="localhost:9876"
设置正确的环境变量后,切换到rocketmq的解压目录,直接运行
.\bin\mqnamesrv.cmd
Open new powershell window, after set the correct environment variable. then change directory to rocketmq type and run:
.\bin\mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true
确保已经正确配置环境变量,切到rocketmq目录并运行。
# 1、发送消息
.\bin\tools.cmd org.apache.rocketmq.example.quickstart.Producer
# 2、接收消息
.\bin\tools.cmd org.apache.rocketmq.example.quickstart.Consumer
通常,直接关闭命令行窗口即可。(请勿在生产环境中执行此操作)
注意
# 编辑runbroker.sh和runserver.sh修改默认JVM大小 vi runbroker.sh vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
RocketMQ中文文档中包含了所有我们需要学习的内容,包括RocketMQ概念与特性,架构设计,RocketMQ最常见各种消息案例、最佳实践、集群部署。中文内容,相信大家只要肯付出时间,不断实践。RocketMQ就是你永远的技术栈。
如何学习一门技术的技巧,你GET到了吗?加油吧,小伙子!!!