zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

2023-04-18 13:12:07 时间

前言

本来是想写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

协议和规范

有序消息

定时消息

批处理消息

广播消息

消息过滤

消息重发

消息存储

消息回溯

消息优先级

高可用性和故障转移

消息轨迹

配置

管理和操作工具

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个先前条件。

  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: ocketmq

添加环境变量

ROCKETMQ_HOME="D:
ocketmq"
NAMESRV_ADDR="localhost:9876"

启动 Name Server

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

.inmqnamesrv.cmd

启动 Broker

Open new powershell window, after set the correct environment variable. then change directory to rocketmq type and run:

.inmqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true

测试RocketMQ发送和接收消息

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

# 1、发送消息
.in	ools.cmd  org.apache.rocketmq.example.quickstart.Producer
# 2、接收消息
.in	ools.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到了吗?加油吧,小伙子!!!