天下没有难学的技术,带你手撕RocketMQ

Posted 程序猿小亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天下没有难学的技术,带你手撕RocketMQ相关的知识,希望对你有一定的参考价值。

前言

本来是想写RocketMQ系列博文第一篇RocketMQ简介,大致内容包括介绍什么是RocketMQ以及教大家如何安装RocketMQ的。但是呢?有网友说,学习RocketMQ官网特别难。

博主本着天下没有难学的技术,带领大家一起手撕RocketMQ。对于技术人员来说,官网才是第一手资料,解决所有棘手问题的起点,也是终点。

学习任何一项技术的通用步骤,三个W,解决所有问题:

1、首先,问What,了解学习这项技术是干嘛的,能够解决现实项目中的什么问题?

2、其次,问How,怎么做,如何下载(找到github),安装,编写简单的HelloWorld,进行实践

3、最终,问Why,为什么要这么做,原理是什么,架构是什么样的?

下面我们就用上面的3个W,手撕RocketMQ官网。

概述,什么是RocketMQ

我们找到RocketMQ官网地址:https://rocketmq.apache.org/

首先,介绍了设计RocketMQ的动机以及原因。阿里初期的消息队列使用的ActiveMQ,随着使用了越来越来的队列和虚拟主题,遇到了ActiveMQ的IO瓶颈。通过节流,断路器或降级等方案,尝试解决问题,但是效果不好。于是研究其他替代方案,但是kafka在低延迟和高可靠性方面不能满足阿里的业务需求,于是设计了RocketMQ。

官网对RocketMQ,ActiveMQ和Kafka三款MQ产品进行了简单的对比,内容如下:

RocketMQ vs. ActiveMQ vs. Kafka

下表展示了RocketMQ,ActiveMQ和Kafka(Apache最流行的消息传递解决方案)之间的比较:

MQ产品客户端 SDK协议和规范有序消息定时消息批处理消息广播消息消息过滤消息重发消息存储消息回溯消息优先级高可用性和故障转移消息轨迹配置管理和操作工具
ActiveMQJava, .NET, C++ 等推模式,支持 OpenWire,STOMP, AMQP, MQTT, JMS独立消费或独立队列可以保证消息有序支持不支持支持支持不支持使用JDBC以及高性能日志(例如levelDB,kahaDB)支持非常快速的持久性支持支持支持, 依赖存储,如果使用levelDB 则需要ZooKeeper不支持默认配置为低级别,用户需要优化配置参数支持
KafkaJava, Scala 等拉模式,支持 TCP保证独立分区内消息的有序性不支持支持(通过异步生产者)不支持支持, 可以使用Kafka Streams 过滤消息不支持高性能文件存储支持按照偏移量表示不支持支持, 需要ZooKeeper不支持Kafka使用键值对格式进行配置。这些值可以从文件或以编程方式提供。支持,使用终端命令公开核心指标
RocketMQJava, C++, Go拉模式, 支持TCP,JMS, OpenMessaging严格确保消息有序,并可以优雅的扩展支持支持,同步模式以避免消息丢失支持支持, 基于SQL92的属性过滤器表示式支持高性能和低延迟的文件存储支持,使用时间戳和偏移量两个指标表示不支持支持, 主从模式,无需其他插件支持开箱即用,用户只需要注意一些配置支持,丰富Web和终端命令可显示核心指标

如何下载及安装

在快速开启中,RocketMQ为我们提供了中文的学习文档,https://github.com/apache/rocketmq/tree/master/docs/cn

学习RocketMQ需要5个先前条件。

  1. 推荐使用64位操作系统,建议使用Linux / Unix / Mac;(Windows用户请参见下面的指南)
  2. 64位JDK 1.8+;
  3. Maven 3.2.x;
  4. Git;
  5. 适用于Broker服务器的4g +可用磁盘

我们既可以通过下载源码编译的方式,进行构建,部署,也可以从下载链接中直接下载已经构建好的工具包进行部署。

  > 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

Linux

启动 Name Server

  # 1.启动NameServer
  > nohup sh bin/mqnamesrv &
  # 2.查看启动日志
  > tail -f ~/logs/rocketmqlogs/namesrv.log
  The Name Server boot success...

启动 Broker

  # 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...

测试RocketMQ发送和接收消息

首先要设置环境变量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

Windows

下载最新的二进制版本。并将zip文件解压缩到本地磁盘中。如:D:\\rocketmq

添加环境变量

ROCKETMQ_HOME="D:\\rocketmq"
NAMESRV_ADDR="localhost:9876"

启动 Name Server

设置正确的环境变量后,切换到rocketmq的解压目录,直接运行

.\\bin\\mqnamesrv.cmd

启动 Broker

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发送和接收消息

确保已经正确配置环境变量,切到rocketmq目录并运行。

# 1、发送消息
.\\bin\\tools.cmd  org.apache.rocketmq.example.quickstart.Producer
# 2、接收消息
.\\bin\\tools.cmd  org.apache.rocketmq.example.quickstart.Consumer

关闭服务器

通常,直接关闭命令行窗口即可。(请勿在生产环境中执行此操作)

注意

  • 问题描述:

    RocketMQ默认的虚拟机内存较大,启动Broker如果因为内存不足失败,需要编辑如下两个配置文件,修改JVM内存大小

# 编辑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到了吗?加油吧,小伙子!!!

博主写作不易,加个关注呗

求关注、求点赞,加个关注不迷路,感谢

点赞是对我最大的鼓励
↓↓↓↓↓↓

以上是关于天下没有难学的技术,带你手撕RocketMQ的主要内容,如果未能解决你的问题,请参考以下文章

天下没有难学的技术,带你手撕RocketMQ

apache ab压测快速使用(天下没有难学的技术,只有LJ的教程)

十道题带你手撕二叉树

索隆带你手撕Dubbo源码,源码阅读其实并不难

来,带你手撕一个AOP

风哥带你手撕算法之吃透二叉树