# 全面解剖 消息中间件 RocketMQ-(1)

27 篇文章 0 订阅
23 篇文章 0 订阅

全面解剖 消息中间件 RocketMQ-(1)

一、RocketMQ 介绍

1、RocketMQ :RocketMQ 消息队列是一种“先进先出”的数据结构。

在这里插入图片描述

  • Apache RocketMQ 是一个功能丰富、设计灵活的分布式消息系统,适用于多种场景下的消息传输需求,包括但不限于服务端之间的通信、IoT 设备的消息处理等。

  • Apache RocketMQ 是一个开源的分布式消息和流数据平台,由阿里巴巴研发,旨在提供高效、可靠、安全的消息传输服务。

它支持多种消息类型,包括普通消息、顺序消息、事务消息和定时/延时消息,以满足不同场景下的需求。RocketMQ 的核心概念包括主题(Topic)、消息队列(MessageQueue)和消息(Message),其中主题用于标识同一类业务逻辑的消息,消息队列是消息存储和传输的实际容器,而消息是 RocketMQ 中的最小数据传输单元。

  • RocketMQ 的设计支持高并发和水平扩展,通过将一个主题分散到多个队列上,实现了队列数量的水平拆分和队列内部的流式存储。

这种设计不仅提升了消息发送和消费的并发度,还保证了消息的可靠传输和系统的可扩展性。此外,RocketMQ 提供了细粒度的消息分类属性(MessageTag),允许消费者通过订阅特定的标签来实现细粒度过滤,从而只接收被过滤后的消息类型。

  • RocketMQ 的架构包括 NameServer 和 Broker 两个核心组件。

NameServer 是无状态的节点,用于保存活跃的 Broker 列表和 topic 列表,并可集群部署以保持信息同步性。

Broker 则负责存储消息和转发消息,拥有 Master 和 Slave 的概念,以实现数据的同步和容错。

  • RocketMQ 还支持消息的持久化存储和消费位点的重置,确保了即使系统故障也能保证消息的可回溯性和可恢复性。

此外,RocketMQ 引入了死信队列(Dead-Letter Queue)的概念,用于处理无法被正常消费的消息,避免了因消费失败而导致的消息丢失。

  • RocketMQ 的设计还考虑了 IoT 场景的特殊需求,通过 RocketMQ-MQTT 扩展项目实现了 RocketMQ 统一接入 IoT 设备和服务端的消息,提供一体化消息存储和互通能力。

这种设计不仅降低了存储成本,还有效地避免了数据在不同系统间同步带来的一致性和挑战。

2、RocketMQ 应用场景主要包含以下3个方面

1)应用解耦

  • 系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

  • 使用 RocketMQ 消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统恢复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

2)流量削峰

  • 应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。

  • 一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样比不能下单体验要好。

  • 处于经济考量目的:业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰。

3)数据分发

  • 通过消息队列可以让数据在多个系统之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可。

在这里插入图片描述

二、全面解剖 RocketMQ – MQ 优缺点比较

1、RocketMQ 优点:解耦、削峰、数据分发。

2、RocketMQ 缺点包含以下几点:

  • 系统可用性降低

系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。
如何保证MQ的高可用?

  • 系统复杂度提高

MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

  • 一致性问题

A系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?

三、全面解剖 RocketMQ – 各大 MQ 产品比较

1、常见的 RocketMQ 产品包括:Kafka、ActiveMQ、RabbitMQ、RocketMQ。

2、各种 RocketMQ 产品的比较

特性ActiveMQRabbitMQRocketMQkafka
开发语言javaerlangjavascala
单机吞吐量万级万级10万级10万级
时效性ms级us级ms级ms级以内
可用性高(主从架构)高(主从架构)非常高(分布式架构)非常高(分布式)
功能特性成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富MQ功能比较完备,扩展性佳只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

四、全面解剖 RocketMQ – RocketMQ 安装

1、RocketMQ 是阿里巴巴2016年 MQ 消息中间件,使用 Java 语言开发,在阿里内部,RocketMQ 承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。

2、RocketMQ 下载安装

2.1 RocketMQ 下载安装环境要求:
  • Linux64 系统
  • JDK1.8(64位)
  • 源码安装需要安装 Maven-3.2.x
2.2 RocketMQ 下载地址:

https://rocketmq.apache.org/
https://rocketmq.apache.org/download/
https://rocketmq.apache.org/zh/download

2.3 把 rocketmq-all-4.5.1-bin-release.zip 上传到 linux 服务器的 /usr/local/rocketmq/ 目录下,并解压。

# 创建新文件夹 rocketmq 
cd /usr/local/
mkdir rocketmq 

# 解压 rocketmq 即安装。
cd /usr/local/rocketmq/
unzip rocketmq-all-4.5.1-bin-release.zip

2.4 RocketMQ 目录介绍:
  • benchmark : 存放一些 demo
  • bin : 启动脚本,包括 shell 脚本和 cmd 脚本,一些可执行文件。
  • conf : 实例配置文件,包括 broker 配置文件,logback 配置文件等。
  • lib : 依赖 jar 包,包括 Netty,commons-lang, FastJson 等。

3、启动 RocketMQ

3.1 启动 NameServer
# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 启动 NameServer
nohup sh bin/mqnamesrv &

# 2.查看启动日志
tail -f ~/1ogs/rocketmq1ogs/namesrv.1og

# 查看启动结果
jps

# 如果出现 NamesrvStartup 说明 Broker 启动成功。

3.2 启动 Broker
# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 启动 Broker
nohup sh bin/mqbroker -n localhost:9876 &

# 查看启动日志
tail -f ~/1ogs/rocketmq1ogs/broker.1og

# 查看启动结果
jps

# 如果出现 BrokerStartup 说明 Broker 启动成功。

在这里插入图片描述

3.3 RocketMQ 启动失败 问题描述:

RocketMQ 默认的虚拟机内存较大,启动 Broker 如果因为内存不足失败,需要编辑如下两个配置文件,修改 JVM 内存大小。
同时需把 JDK 替换为自己的 JDK 安装目录。

sudo vim bin/runserver.sh
sudo vim bin/runbroker.sh
sudo vim bin/tools.sh

# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 编辑 runbroker.sh 、 runserver.sh 和 tools.sh 三个文件。修改默认 JVM 大小,同时把 JDK 替换为自己的 JDK 安装目录。
sudo vim bin/runbroker.sh
sudo vim bin/runserver.sh 
sudo vim  bin/tools.sh

# 1)注释掉官方配置的 3 行代码。修改 JDK 成你自己的安装目录:添加一行,同时,修改虚拟内存大小。参考如下:

# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
# [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

# 2)添加你自己的 JDK 安装目录如下:
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

# 3)修改虚拟内存大小,参考如下:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

在这里插入图片描述

3.4 关闭 RocketMQ
# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 关闭 NameServer 
sh bin/mqshutdown namesrv 

# 关闭 Broker 
sh bin/mqshutdown broker 

4、可以下载安装 Notepad++ 再安装插件 NppFTP,远程连接 linux 服务器,查看文件。

# 使用 Notepad++ 高级文本编辑器 安装 NppFTP 插件,实现文件的在线编辑和下载

在这里插入图片描述

五、全面解剖 RocketMQ – 测试发送消息和接受消息

1、RocketMQ 发送消息


# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 设置临时环境变量
export NAMESRV_ADDR=localhost:9876

# 使用安装包的 Demo 发送消息 
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

2、RocketMQ 接受消息


# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 设置临时环境变量
export NAMESRV_ADDR=localhost:9876

# 使用安装包的 Demo 发送消息 
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer 

3 关闭 RocketMQ


# 进入 RocketMQ 安装目录
cd /usr/local/rocketmq/rocketmq-all-4.5.1-bin-release/

# 关闭 NameServer 
sh bin/mqshutdown namesrv 

# 关闭 Broker 
sh bin/mqshutdown broker 

在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段子手-168

你的鼓励将是我你的创作最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值