RocketMQ超详细教程:涵盖单机、集群部署及核心功能应用!

目录


一、RocketMQ概述

1、RocketMQ简介

RocketMQ是由阿里巴巴开源的一个分布式消息中间件和流计算平台,它为用户提供了丰富的消息服务模式,包括顺序消息、延迟消息、批量消息等,旨在解决大规模分布式系统中消息传递的一致性、可靠性和高性能问题。

(1)背景

在互联网时代,随着业务规模的不断扩大,系统架构逐渐向分布式、微服务转型。在这样的背景下,消息中间件成为了分布式系统中不可或缺的组件。RocketMQ便是阿里巴巴在分布式消息中间件领域的一次重要实践。

(2)特点

  1. 高吞吐量:RocketMQ采用顺序写盘和零拷贝技术,实现了高吞吐量的消息处理能力,单机峰值可达数百万条消息/秒。

  2. 高可用性:RocketMQ采用了主从复制、故障转移等机制,确保了消息服务的可靠性和稳定性。

  3. 灵活的消息服务模式:RocketMQ支持多种消息服务模式,包括同步发送、异步发送、批量发送、顺序消息、延迟消息等,满足不同业务场景的需求。

  4. 丰富的客户端支持:RocketMQ提供了Java、C++、Python等多种语言的客户端支持,方便用户在不同场景下使用。

  5. 可扩展性:RocketMQ支持水平扩展,用户可以根据业务需求动态调整集群规模。

(3)核心概念

  1. 消息:消息是RocketMQ中最基本的数据单元,包括消息体和消息属性两部分。消息体是实际传输的数据,消息属性则包含了消息的元数据信息。

  2. 主题:主题是消息的分类,生产者向特定主题发送消息,消费者从特定主题读取消息。

  3. 生产者:生产者负责发送消息,可以是应用程序、服务器等。

  4. 消费者:消费者负责接收消息,可以是应用程序、服务器等。

  5. 集群:RocketMQ采用集群部署,包括多个Broker节点,每个节点负责存储和处理消息。

(4)应用场景

  1. 异步处理:RocketMQ可以用于异步处理业务逻辑,提高系统响应速度。

  2. 解耦系统:RocketMQ可以将不同模块之间的依赖关系解耦,降低系统复杂度。

  3. 流量削峰:RocketMQ可以缓解系统在高并发场景下的压力,实现流量的削峰填谷。

  4. 分布式事务:RocketMQ支持分布式事务消息,确保业务操作的原子性和一致性。

  5. 大数据处理:RocketMQ可以与大数据技术结合,实现实时数据处理和分析。

总之,RocketMQ作为一款优秀的分布式消息中间件,为用户提供了丰富的消息服务功能和高度可用的消息处理能力,广泛应用于各种业务场景。

2、RocketMQ核心概念

在深入了解RocketMQ的架构和功能之前,有必要先了解其核心概念。这些概念是理解RocketMQ工作原理和进行有效使用的基础。

(1)消息(Message)

消息是RocketMQ中最基本的数据单元,它由消息体(Body)和消息属性(Properties)两部分组成。

消息体:消息体是消息的实际内容,通常是一个字节序列,可以是文本、图片、视频等任何类型的数据。消息体的大小有一定的限制,通常不超过4MB。

消息属性:消息属性是消息的元数据,包括消息的键值对信息。这些信息可以用来描述消息的额外信息,如业务标识、消息类型、消息优先级等。消息属性在消息过滤、消息检索等场景中发挥着重要作用。

(2)主题(Topic)

主题是消息的分类单位,用于标识消息的类型。生产者将消息发送到特定的主题,消费者则从特定的主题中读取消息。一个主题可以有多个生产者和消费者。主题的命名通常遵循一定的规范,以便于管理和识别。

(3)生产者(Producer)

生产者是消息的发送者,负责将消息发送到RocketMQ的消息队列中。生产者可以是应用程序、服务器或者其他任何能够生成消息的实体。RocketMQ支持多种消息发送模式,包括同步发送、异步发送和批量发送。

  • 同步发送:生产者在发送消息后会等待RocketMQ的响应,直到消息被成功存储。
  • 异步发送:生产者在发送消息后不会等待响应,而是通过回调函数来处理发送结果。
  • 批量发送:生产者可以一次发送多条消息,以提高发送效率。

(4)消费者(Consumer)

消费者是消息的接收者,负责从RocketMQ的消息队列中读取消息并处理。消费者可以是应用程序、服务器或其他任何需要处理消息的实体。RocketMQ支持两种消费模式:

  • 拉模式:消费者主动从RocketMQ拉取消息,适用于消息量较大的场景。
  • 推模式:RocketMQ主动将消息推送给消费者,适用于消息量较小的场景。

(5)消息队列(Message Queue)

消息队列是RocketMQ中存储消息的物理单元,每个主题下可以有多个消息队列。消息队列的分布和数量可以根据业务需求进行配置,以实现负载均衡和故障隔离。

(6)Broker

Broker是RocketMQ的消息服务节点,负责处理消息的存储、转发、复制等任务。一个RocketMQ集群由多个Broker组成,每个Broker都可以独立处理消息。

(7)集群(Cluster)

RocketMQ采用集群部署,包括多个Broker节点。集群中的Broker通过主从复制、故障转移等机制,确保了消息服务的高可用性和高可靠性。

(8)命名服务(Name Server)

命名服务是RocketMQ集群中的核心组件之一,它负责维护集群中所有Broker的状态信息,以及提供主题和消息队列的路由信息。生产者和消费者通过命名服务来发现和连接到对应的Broker。

(9)顺序消息(Ordered Message)

顺序消息是指按照一定的顺序进行投递的消息。RocketMQ保证同一个消息队列中的消息顺序性,适用于需要严格顺序处理的业务场景。

(10)延迟消息(Delayed Message)

延迟消息是指可以在指定时间后才被消费者消费的消息。RocketMQ支持消息的延迟投递,适用于需要实现定时任务或消息延迟处理的业务场景。

(11)批量消息(Batch Message)

批量消息是指一次发送多条消息的能力。RocketMQ支持批量发送消息,可以显著提高消息发送的效率,适用于消息量较大的场景。

通过了解这些核心概念,我们可以更好地理解RocketMQ的工作原理,并在实际使用中更加灵活地运用其提供的各种功能。

3、RocketMQ架构解析

RocketMQ作为一个高性能、低延迟的分布式消息中间件,其架构设计巧妙,充分考虑了高可用性、高可靠性和水平扩展性。

(1)整体架构

RocketMQ的整体架构主要包括以下几个核心组件:

  • 命名服务(Name Server):作为整个RocketMQ集群的“大脑”,命名服务负责管理和维护集群中所有Broker的状态信息,以及提供主题和消息队列的路由信息。它采用去中心化的设计,通过心跳机制和定时任务来保证服务的可用性和一致性。

  • Broker:Broker是RocketMQ集群中的核心服务节点,负责消息的存储、转发、复制等任务。每个Broker都可以独立处理消息,并且支持主从复制模式,以实现故障转移和负载均衡。

  • 生产者(Producer):生产者是消息的发送者,负责将消息发送到RocketMQ集群。生产者可以采用多种发送模式,包括同步发送、异步发送和批量发送。

  • 消费者(Consumer):消费者是消息的接收者,负责从RocketMQ集群中读取并处理消息。消费者可以选择拉模式或推模式来接收消息。

(2)命名服务架构

命名服务是RocketMQ集群中的关键组件,其架构设计如下:

  • 服务注册与发现:Broker节点在启动时会向命名服务注册自己,命名服务会维护一个Broker列表,并定期更新这些信息。生产者和消费者通过命名服务来发现可用的Broker节点。

  • 路由管理:命名服务负责维护主题与消息队列之间的路由信息。当生产者或消费者请求发送或接收消息时,命名服务会提供相应的路由信息,确保消息能够正确地发送到目标队列。

  • 集群管理:命名服务通过心跳机制来监控Broker节点的健康状态。如果某个Broker节点发生故障,命名服务会将其从可用列表中移除,并触发故障转移机制。

(3)Broker架构

Broker作为RocketMQ的核心服务节点,其架构设计如下:

  • 消息存储:Broker使用顺序写的方式来存储消息,这大大提高了消息的写入效率。消息存储在磁盘上,并支持批量写入和快速检索。

  • 消息转发:当生产者发送消息到Broker时,Broker会根据消息的主题和队列信息将消息转发到相应的消息队列中。

  • 消息复制:为了提高消息的可靠性,RocketMQ支持消息的同步复制和异步复制。主从复制机制确保了在主节点发生故障时,从节点可以立即接管服务。

  • 负载均衡:Broker之间通过负载均衡机制来分配消息队列,以实现负载均匀分布和资源的高效利用。

(4)消息队列架构

消息队列是RocketMQ中存储消息的物理单元,其架构设计如下:

  • 队列管理:每个主题下可以有多个消息队列,消息队列的数量可以根据业务需求进行配置。消息队列采用环形数组的方式存储消息,提高了消息的读写效率。

  • 消息顺序性:RocketMQ通过将同一个业务关键字的同一条消息发送到同一个队列,来保证消息的顺序性。

  • 消息索引:为了快速检索消息,RocketMQ为每个消息队列维护了一个索引文件,记录了消息的物理位置信息。

(5)生产者与消费者架构

生产者和消费者的架构设计如下:

  • 生产者:生产者通过连接命名服务来获取Broker信息,并将消息发送到对应的Broker。生产者支持多种发送模式,以满足不同业务场景的需求。

  • 消费者:消费者通过连接命名服务来获取消息队列信息,并从Broker中拉取或接收消息。消费者可以选择拉模式或推模式来处理消息。

通过上述架构解析,我们可以看到RocketMQ在保证消息的高可用性、高可靠性和高性能方面做出了精心的设计。其灵活的架构使得RocketMQ能够适应各种复杂的业务场景,为用户提供稳定、高效的消息服务。

二、RocketMQ安装与部署

1、环境准备

在深入RocketMQ的安装与部署之前,首先需要确保您的系统环境满足RocketMQ的运行要求。以下是安装RocketMQ前需要进行的环境准备工作。

(1)操作系统

RocketMQ支持主流的Linux操作系统,建议使用以下版本的操作系统之一:

  • CentOS Linux 7.x
  • Ubuntu 16.04 LTS
  • Debian 9.x

确保操作系统更新到最新的稳定版本,以避免潜在的安全问题和兼容性问题。

(2)Java环境

RocketMQ是使用Java语言编写的,因此需要安装Java环境。具体要求如下:

  • Java版本:建议使用Java 8或Java 11,因为RocketMQ的客户端和服务端都是基于这些版本进行开发和测试的。
  • JDK:建议安装OpenJDK或Oracle JDK。
  • 环境变量:确保JAVA_HOME环境变量设置正确,并在系统的PATH变量中包含JDK的bin目录。

安装Java环境的方法如下:

# 以安装OpenJDK 8为例
sudo apt-get update
sudo apt-get install openjdk-8-jdk

安装完成后,可以通过以下命令验证Java版本:

java -version

(3)依赖库

RocketMQ依赖于一些外部库,包括但不限于:

  • Snappy:用于压缩和解压缩消息。
  • LZ4:另一种压缩算法,可选。
  • VMAccess:用于访问虚拟内存。

这些依赖库可以通过以下方式安装:

sudo apt-get install snappy libsnappy-dev lz4 liblz4-dev

(4)网络配置

RocketMQ依赖于网络通信,因此需要确保以下网络配置正确:

  • 确保防火墙设置允许RocketMQ使用的端口(默认为10911和10912)。
  • 如果RocketMQ部署在内网环境中,需要确保内网之间的网络通信正常。
  • 如果RocketMQ需要与外网进行通信,需要配置正确的公网IP和端口映射。

(5)存储配置

RocketMQ使用磁盘存储消息数据,因此需要确保以下存储配置:

  • 确保有足够的磁盘空间用于存储消息数据。
  • 建议使用SSD磁盘,以提高消息的读写性能。
  • 如果使用机械硬盘,建议使用RAID技术提高数据的可靠性和读写性能。

(6)系统参数优化

为了确保RocketMQ能够高效运行,建议对以下系统参数进行优化:

  • 文件描述符限制:增加系统级别的文件描述符限制,以支持更多的并发连接。
  • 网络栈优化:调整网络栈参数,如TCP栈大小、连接数等,以提高网络通信性能。
  • 系统调优:根据RocketMQ的运行特性,对系统的调度策略、内存管理等进行调优。

以下是调整文件描述符限制的一个示例:

# 修改系统文件描述符限制
echo '* - nofile 655360' >> /etc/security/limits.conf

(7)其他注意事项

  • 时间同步:确保服务器时间同步,避免因时间差异导致的元数据不一致问题。
  • 系统监控:安装必要的系统监控工具,如Prometheus、Grafana等,以便于监控RocketMQ的运行状态。

通过上述的环境准备工作,可以为RocketMQ的安装与部署提供一个稳定、可靠的基础。

2、RocketMQ单机模式部署

在了解了RocketMQ的基本概念和架构之后,我们将进入实际的部署环节。RocketMQ的单机模式部署相对简单,适合用于开发测试或小规模的生产环境。以下是详细的单机模式部署步骤。

(1)下载RocketMQ安装包

首先,需要从RocketMQ的官方GitHub仓库下载最新的安装包。您可以通过以下命令进行下载:

wget https://github.com/apache/rocketmq/releases/download/rocketmq-5.0.0/rocketmq-5.0.0-bin-release.zip

确保下载的是与您系统兼容的版本。

(2)解压安装包

下载完成后,需要对安装包进行解压。以下是解压命令:

unzip rocketmq-5.0.0-bin-release.zip
cd rocketmq-5.0.0-bin-release

(3)配置环境变量

为了方便后续操作,建议将RocketMQ的安装路径添加到系统的环境变量中。编辑~/.bashrc~/.zshrc文件,并添加以下内容:

export ROCKETMQ_HOME=/path/to/rocketmq-5.0.0-bin-release
export PATH=$PATH:$ROCKETMQ_HOME/bin

之后,使用source ~/.bashrcsource ~/.zshrc命令使环境变量生效。

(4)准备运行环境

RocketMQ需要Java环境,确保已经安装了Java 8或Java 11,并且JAVA_HOME环境变量设置正确。

(5) 启动NameServer

NameServer是RocketMQ的核心组件之一,负责维护集群信息和服务发现。启动NameServer的命令如下:

nohup sh bin/mqnamesrv &

启动后,可以通过访问http://localhost:9876来检查NameServer是否正常启动。

(6)启动BrokerServer

BrokerServer是RocketMQ的消息存储和传输服务。在单机模式下,我们只需要启动一个BrokerServer。以下是启动命令:

nohup sh bin/mqbroker -n localhost:9876 &

这里的-n参数指定了NameServer的地址,确保BrokerServer能够注册到NameServer上。

(7)验证部署

部署完成后,可以通过以下命令来验证RocketMQ是否正常运行:

sh bin/mqadmin status -n localhost:9876

该命令将返回NameServer和BrokerServer的状态信息。

(8)配置文件

RocketMQ的配置文件位于conf目录下。您可以根据需要修改broker.confnamesrv.conf等配置文件,以适应不同的部署需求。

  • broker.conf:包含BrokerServer的配置信息,如存储路径、端口、日志配置等。
  • namesrv.conf:包含NameServer的配置信息,如端口、日志配置等。

(9)注意事项

  • 端口冲突:确保NameServer和BrokerServer使用的端口没有与其他服务冲突。
  • 系统资源:监控系统的CPU、内存和磁盘使用情况,确保RocketMQ有足够的资源运行。
  • 日志文件:RocketMQ的日志文件位于logs目录下,可以通过查看日志来排查问题。

通过以上步骤,您已经成功部署了RocketMQ的单机模式。单机模式虽然简单,但也可以作为理解RocketMQ工作原理和进行基础测试的良好起点。对于生产环境,通常建议使用集群模式来提高系统的可靠性和性能。

3、RocketMQ集群模式部署

在了解了RocketMQ的基本概念和单机模式部署之后,我们将进一步探讨如何在生产环境中部署RocketMQ集群模式。集群模式能够提供高可用性、高吞吐量和负载均衡等特性,是构建大规模分布式系统的关键组成部分。

(1)集群模式概述

RocketMQ的集群模式主要包括NameServer集群和BrokerServer集群两部分。NameServer集群负责服务注册和发现,而BrokerServer集群则负责消息的存储和转发。集群模式可以支持多种部署方式,如双主模式、主从模式等。

(2)集群部署前的准备工作

在部署集群前,需要确保以下准备工作已完成:

  • 系统环境:确保所有服务器都安装了Java环境,并且Java版本与RocketMQ兼容。
  • 网络配置:确保所有服务器之间的网络通信正常,无防火墙或安全组策略限制。
  • 存储配置:为BrokerServer准备足够的存储空间,并确保存储性能满足需求。
  • 环境变量:配置好环境变量,如JAVA_HOMEROCKETMQ_HOME等。

(3)NameServer集群部署

NameServer集群的部署相对简单,只需确保每个节点上的NameServer能够相互通信即可。

3.1 配置NameServer

编辑conf/namesrv.conf文件,配置NameServer的监听端口和日志路径等信息。例如:

# namesrv.conf
listenPort=9876
# 可选,配置日志路径
logPath=/path/to/namesrv/logs
3.2 启动NameServer

在每个节点上执行以下命令启动NameServer:

nohup sh bin/mqnamesrv &

启动成功后,NameServer将自动在集群内进行通信。

(4)BrokerServer集群部署

BrokerServer集群的部署需要考虑高可用性和负载均衡,以下是一个基本的部署流程。

4.1 配置BrokerServer

编辑conf/broker.conf文件,配置BrokerServer的相关参数,包括集群名称、存储路径、角色(Master或Slave)等。例如:

# broker.conf
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0 # 0表示Master,大于0表示Slave
# 可选,配置存储路径
storePathRootDir=/path/to/broker/store
# 可选,配置日志路径
logPath=/path/to/broker/logs

对于Slave节点,需要设置不同的brokerIdbrokerName

4.2 启动BrokerServer

在每个节点上执行以下命令启动BrokerServer:

nohup sh bin/mqbroker -c conf/broker.conf -n localhost:9876 &

这里-c参数指定了配置文件,-n参数指定了NameServer的地址。

4.3 验证集群状态

启动成功后,可以使用以下命令来验证集群状态:

sh bin/mqadmin clusterList -n localhost:9876

该命令将列出所有已注册的BrokerServer及其状态。

(5)高级部署策略

为了提高系统的稳定性和性能,以下是一些高级部署策略:

  • 多活部署:在多个数据中心部署NameServer和BrokerServer,实现跨地域的高可用性。
  • 负载均衡:通过配置不同的队列和主题,以及使用负载均衡策略,优化消息的存储和转发。
  • 数据备份:定期对消息数据进行备份,以防数据丢失或损坏。
  • 监控与报警:使用RocketMQ提供的监控工具,如MQAdmin,以及集成第三方监控工具,如Prometheus和Grafana,实现实时监控和报警。

(6)注意事项

  • 集群规模:根据业务需求选择合适的集群规模,避免过度部署或资源浪费。
  • 性能测试:在部署完成后进行性能测试,确保集群能够满足预期的性能要求。
  • 安全性:确保集群的安全性,如通过SSL加密通信,以及配置合理的权限控制。

通过以上步骤,您可以成功部署RocketMQ的集群模式。集群模式不仅能够提供高可用性和高吞吐量,还能够通过灵活的部署策略来适应不同的业务场景,是构建大规模分布式系统的理想选择。

三、RocketMQ核心功能

1、消息发送

消息发送是RocketMQ最基本的功能之一,它确保了消息能够可靠、高效地从生产者传递到消费者。下面我们将详细介绍RocketMQ消息发送的流程、方式和注意事项。

(1)消息发送流程

RocketMQ的消息发送流程主要包括以下几个步骤:

1. 生产者启动

生产者在启动时,会首先与NameServer建立连接,获取Topic对应的BrokerServer信息。这个过程中,NameServer会返回一个BrokerServer列表给生产者。

2. 消息发送

生产者发送消息时,会根据Topic和MessageQueue选择一个合适的BrokerServer,然后将消息发送到该BrokerServer上。这个过程分为以下几个子步骤:

  • 序列化:生产者将消息对象序列化为字节流。
  • 消息路由:生产者根据Topic和MessageQueue选择一个BrokerServer。
  • 网络传输:生产者通过网络将消息发送到选定的BrokerServer。
3. 消息确认

消息发送到BrokerServer后,BrokerServer会返回一个确认响应给生产者。如果发送成功,生产者可以选择立即返回或等待消息被消费后再返回。如果发送失败,生产者可以选择重试发送。

(2)消息发送方式

RocketMQ支持多种消息发送方式,以满足不同的业务需求:

同步发送

同步发送是指生产者在发送消息后,会等待BrokerServer的确认响应。这种方式适用于对消息可靠性要求较高的场景。如果发送失败,生产者可以选择重试发送。

// 同步发送消息示例
SendResult sendResult = producer.send(message);
System.out.println(\Send result: \ + sendResult);
异步发送

异步发送是指生产者在发送消息后,不会等待BrokerServer的确认响应,而是通过回调函数来处理发送结果。这种方式适用于对消息发送效率要求较高的场景。

// 异步发送消息示例
producer.send(message, new SendCallback() {
    @Override
    public void onMessageSent(SendResult sendResult) {
        System.out.println(\Send result: \ + sendResult);
    }

    @Override
    public void onException(Throwable e) {
        System.out.println(\Send exception: \ + e.getMessage());
    }
});
单向发送

单向发送是指生产者在发送消息后,既不等待BrokerServer的确认响应,也不处理发送结果。这种方式适用于对消息发送效率要求极高,但对消息可靠性要求不高的场景。

// 单向发送消息示例
producer.sendOneway(message);

(3)消息发送注意事项

在发送消息时,以下是一些需要注意的事项:

  • 消息大小:RocketMQ限制单条消息的大小,默认为4MB。如果消息过大,需要考虑分片发送。
  • 消息顺序:如果业务需要保证消息的顺序性,应该使用顺序消息发送方式,并确保消息按照顺序投递。
  • 消息重试:如果消息发送失败,生产者可以选择重试发送。重试次数和策略可以根据业务需求配置。
  • 消息过滤:RocketMQ支持消息过滤功能,可以根据消息的属性进行过滤,以确保消息只被特定的消费者消费。
  • 消息超时:对于同步发送和异步发送,可以设置消息发送的超时时间,以防止因网络问题导致生产者长时间等待。

消息发送是RocketMQ核心的功能之一,通过灵活的消息发送方式和详细的配置选项,RocketMQ能够满足不同业务场景下的消息传递需求。正确理解和掌握消息发送的流程和注意事项,对于构建稳定、高效的分布式系统至关重要。

2、消息接收

消息接收是RocketMQ中至关重要的环节,它确保了消费者能够从BrokerServer中正确、高效地获取到消息。

(1)消息接收机制

RocketMQ的消息接收机制基于Pull模式,即消费者主动从BrokerServer拉取消息。这种机制允许消费者根据自身的处理能力来控制消息的拉取频率,从而避免消息的积压和处理不过来。

  1. 消费者启动:消费者在启动时,向NameServer发送请求,获取其订阅的Topic对应的BrokerServer信息。

  2. 消息拉取:消费者根据获取到的BrokerServer信息,主动向BrokerServer发起拉取请求。BrokerServer在接收到请求后,会返回一批消息给消费者。

  3. 消息处理:消费者接收到消息后,会进行业务逻辑处理,处理完成后,根据业务需求进行消息确认。

(2)消息接收方式

RocketMQ提供了多种消息接收方式,以满足不同的业务需求:

1. 拉取模式(Pull)

拉取模式是RocketMQ默认的消息接收方式,消费者通过主动拉取的方式获取消息。这种方式允许消费者根据自身的处理能力来控制消息的拉取频率。

// 拉取模式示例
while (true) {
    PullResult pullResult = consumer.pull(messageQueue, messageClass, 1000);
    switch (pullResult.getPullStatus()) {
        case FOUND:
            // 处理消息
            break;
        case NO_NEW_MESSAGE:
            // 没有新消息
            break;
        case OFFSET_ILLEGAL:
            // 偏移量不合法
            break;
        default:
            break;
    }
}
2. 推送模式(Push)

推送模式是RocketMQ提供的一种更为便捷的消息接收方式。消费者通过注册监听器,当有新消息到达时,BrokerServer会主动推送消息给消费者。

// 推送模式示例
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext context) {
        // 处理消息
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});

(3)消息接收配置

在消息接收过程中,可以通过以下配置来优化消费者的行为:

  1. 消费线程数:消费者可以通过配置消费线程数来提高消息处理的并行度,从而提高整体的处理效率。
consumer.setConsumeThreadNums(20);
  1. 批量消费大小:消费者可以配置批量消费的大小,以减少网络请求的次数,提高消息处理的效率。
consumer.setConsumeBatchSize(10);
  1. 消息消费超时时间:消费者可以配置消息消费的超时时间,以防止因处理消息时间过长导致消费者线程阻塞。
consumer.setConsumeTimeout(3000);

(4)消息接收注意事项

在接收消息时,以下是一些需要注意的事项:

  1. 消息顺序性:如果业务需要保证消息的顺序性,应该使用顺序消费模式,并确保消费者按照顺序处理消息。

  2. 消息确认:在处理完消息后,消费者需要向BrokerServer发送消息确认,以告知BrokerServer该消息已经被成功处理。

  3. 异常处理:消费者在处理消息时,应该添加异常处理逻辑,以防止因处理异常导致的消息消费失败。

  4. 幂等性处理:消费者在处理消息时,应该确保幂等性,即重复消费同一消息不会对业务结果产生影响。

  5. 消费偏移量管理:消费者需要管理消费偏移量,以确保在发生故障时能够从正确的位置继续消费消息。

消息接收是RocketMQ中至关重要的环节,通过灵活的消息接收方式和详细的配置选项,RocketMQ能够满足不同业务场景下的消息处理需求。正确理解和掌握消息接收的机制和注意事项,对于构建稳定、高效的分布式系统具有重要意义。

3、消息存储与检索

消息存储与检索是RocketMQ的核心功能之一,它确保了消息的安全可靠存储以及快速高效检索。

(1)消息存储机制

RocketMQ采用了一种混合型的存储机制,结合了顺序写和随机读的特点,以实现高吞吐量和低延迟的消息处理。

  1. 顺序写:消息在写入时,按照时间顺序追加到文件中,这种顺序写的特性大大提高了消息写入的效率。

  2. 随机读:消息的读取操作是随机的,RocketMQ通过维护一个索引文件,快速定位到消息的具体位置,从而快速的消息检索。

(2)存储结构

RocketMQ存储结构主要包括以下几个部分:

  1. CommitLog:Log是RocketMQ中消息实际存储的地方,它是一个有序的文件,所有的消息都会按照顺序写入到这个文件中。

  2. ConsumeQueue:ConsumeQueue是消息消费队列,它为每个Topic和MessageQueue维护一个索引,指向CommitLog中对应消息的物理位置。

  3. IndexFile:IndexFile是索引文件,它记录了消息的Key和对应的MessageID,以及消息在CommitLog中的偏移量。

  4. MessageStoreConfig:MessageStoreConfig是消息存储的配置文件,包含了存储相关的参数配置,如存储路径、文件大小、索引间隔等。

(3)消息检索方式

RocketMQ提供了多种消息检索,以满足不同的业务需求:

  1. 通过MessageID检索:用户可以通过MessageID直接定位到消息在CommitLog中的位置,这种方式适用于需要精确查找特定消息的场景。

2.通过消息Key检索**:用户可以通过消息的Key来检索消息,这种方式适用于需要根据业务键值查找消息的场景。

  1. 通过时间戳检索:用户可以通过指定时间戳范围来检索消息,这种方式适用于需要查找在特定时间段内消息的场景。

(4)存储与检索优化策略

为了提高存储和检索的效率,RocketMQ采取了一系列的优化策略:

  1. 批量写入:RocketMQ支持批量写入消息,这样可以减少I/O次数,提高写入效率。

  2. 异步刷盘:RocketMQ采用异步刷盘的方式,消息写入内存后,异步地将消息持久化到磁盘,这样可以减少对写入性能的影响。

  3. 索引压缩:RocketMQ对索引文件进行压缩,减少索引文件的大小,从而减少内存占用和磁盘I/O。

  4. 读写分离RocketMQ支持读写分离,即不同的线程负责消息的写入和读取操作,这样可以避免读写冲突,提高整体性能。

  5. 消息清理:RocketMQ定期清理过期的消息,释放存储空间,保持存储系统的健康。

(5)消息存储与检索注意事项

在使用RocketMQ进行消息存储与检索时,是一些需要注意的事项:

  1. 消息持久化:确保消息在写入后能够被持久化到磁盘,以防止系统故障导致消息丢失。

  2. 消息索引:合理配置索引文件的间隔和大小,以平衡索引文件的内存占用和检索效率。

3.消息清理策略**:根据业务需求,配置消息清理策略,以避免存储空间不足。

  1. 恢复:在系统发生故障后,需要确保能够快速恢复消息存储和检索服务。

消息存储与检索是RocketMQ能够提供可靠消息服务的基础。通过深入了解其存储机制、存储结构、检索方式以及优化策略,开发者可以更好地利用RocketMQ构建高效、可靠的分布式消息系统。在实际应用中,配置和优化存储与检索,对于保障消息系统的稳定性和性能至关重要。

四、RocketMQ高级特性

1、顺序消息

在分布式系统中,消息的顺序性对于某些业务场景至关重要。RocketMQ提供了顺序消息的机制,确保消息按照一定的顺序被生产和消费,这对于需要保持数据一致性的业务流程尤为重要。本节将详细介绍RocketMQ中顺序消息的概念、实现机制以及如何使用顺序消息。

(1)顺序消息的概念

顺序消息指的是消息按照一定的顺序被发送和消费。在RocketMQ中,顺序消息分为全局顺序消息和分区顺序消息:

  • 全局顺序消息:所有消息严格按照先入先出的顺序进行发送和消费。
  • 分区顺序消息:消息按照分区有序,即每个分区内的消息是有序的,但不同分区之间不保证有序。

(2)顺序消息的实现机制

RocketMQ通过以下机制实现顺序消息:

  1. Message Queue:RocketMQ的消息队列(Message Queue)是顺序消息实现的基础。每个Message Queue内部的消息是有序的。

  2. Message ID:每个消息都有一个唯一的Message ID,RocketMQ通过Message ID来保证消息的顺序性。

  3. 索引队列:RocketMQ为顺序消息维护了一个索引队列,记录了每个Message Queue中的消息偏移量,以便快速定位到下一个要消费的消息。

  4. 顺序消费:消费者在消费消息时,需要按照索引队列的顺序进行消费,确保消息的顺序性。

(3)如何使用顺序消息

在RocketMQ中使用顺序消息,需要进行以下步骤:

  1. 发送顺序消息

    • 在发送消息时,需要指定Message Queue的选择策略。RocketMQ提供了默认的选择策略,也可以自定义选择策略。
    • 消息体中可以包含业务相关的顺序标识,如时间戳、业务ID等。
  2. 消费顺序消息

    • 消费者需要使用顺序消费的方式来处理消息,即每次消费一个Message Queue中的消息,并等待该消息处理完成后再消费下一个消息。
    • RocketMQ提供了顺序消费的API,消费者需要实现MessageListenerOrderly接口来处理顺序消息。

(4)顺序消息的使用场景

顺序消息适用于以下场景:

  1. 分布式事务:在分布式事务中,需要保证多个服务之间的事务顺序一致性。

  2. 数据同步:在数据同步过程中,需要保证数据的同步顺序,以避免数据不一致。

  3. 定时任务:在定时任务中,需要按照一定的顺序执行任务,以保持业务流程的连贯性。

(5)顺序消息的注意事项

在使用顺序消息时,需要注意以下事项:

  1. 消息顺序性:虽然RocketMQ可以保证Message Queue内的消息顺序性,但在网络分区、消息重试等情况下,消息的顺序性可能会受到影响。

  2. 消息消费:顺序消息的消费需要谨慎处理,一旦消费失败,需要考虑如何重试,以及如何保证重试后的顺序性。

  3. 性能影响:顺序消息可能会对性能产生一定的影响,因为消费者需要按照顺序处理消息,不能并行处理。

  4. 死锁:在处理顺序消息时,需要注意避免死锁的情况,特别是在多个消费者同时处理消息时。

顺序消息是RocketMQ提供的一项高级特性,它为需要保持消息顺序性的业务场景提供了解决方案。通过理解顺序消息的概念、实现机制以及使用方法,开发者可以更好地利用RocketMQ来构建符合业务需求的分布式消息系统。在使用顺序消息时,需要仔细考虑消息的顺序性、消费策略以及可能出现的性能问题,以确保系统的稳定性和高效性。

2、延迟消息

延迟消息是RocketMQ的一项高级特性,它允许用户发送将在未来某个时间点投递的消息。这项特性对于实现定时任务、延时处理等场景非常有用。

(1)延迟消息的实现

RocketMQ通过以下机制实现延迟消息:

  1. 消息队列:延迟消息存储在特定的消息队列中,与其他消息隔离。

  2. 定时任务:RocketMQ内部有一个定时任务,负责检查队列中的延迟消息,并在指定的时间点投递给消费者。

  3. 时间戳:延迟消息的发送时间通过消息的时间戳来控制。

(2)如何使用延迟消息

在RocketMQ中使用延迟消息,需要进行以下步骤:

  1. 发送延迟消息

    • 在发送消息时,需要设置消息的延迟时间。RocketMQ支持固定的延迟级别,如1秒、5秒、10秒等,也可以自定义延迟时间。
    • 使用Message对象的setDelayTimeLevel方法来设置延迟级别或自定义延迟时间。
  2. 消费延迟消息

    • 消费者与普通消息的消费方式相同,不需要特别处理延迟消息。
    • RocketMQ会自动在指定的时间点将延迟消息投递给消费者。

(3)延迟消息的使用场景

延迟消息适用于以下场景:

  1. 定时任务:如定时发送通知、定时清理过期数据等。

  2. 延时处理:如订单超时取消、延时确认交易等。

  3. 流量削峰:在高峰时段,通过延迟消息来分散系统的压力。

(4)延迟消息的注意事项

在使用延迟消息时,需要注意以下事项:

  1. 延迟时间:延迟时间设置应合理,过长的延迟时间可能会导致消息积压。

  2. 消息顺序:延迟消息可能会影响消息的顺序,尤其是在多个延迟级别同时使用时。

  3. 性能影响:延迟消息可能会对系统的性能产生一定的影响,特别是在延迟消息量较大时。

延迟消息是RocketMQ提供的一项强大功能,它为开发者提供了一种灵活处理消息投递时间的手段。通过合理使用延迟消息,可以优化业务流程,提高系统的响应速度和用户体验。在部署RocketMQ集群时,确保延迟消息的正确配置和使用,对于构建高效、可靠的分布式消息系统至关重要。

3、批量消息

在分布式系统中,批量处理消息是一种常见的优化手段,它可以显著提高系统的吞吐量和降低网络传输成本。RocketMQ提供了批量消息处理的能力,允许用户在一次网络请求中发送多条消息,这对于需要高效率消息传输的场景尤为重要。

(1)批量消息的概念

批量消息指的是将多条消息打包成一个批次进行发送和处理。这种方式可以减少网络请求的次数,降低网络延迟,同时减少对Broker的访问压力,提高整体的消息处理效率。

(2)批量消息的优势

批量消息具有以下优势:

  1. 降低网络开销:通过减少网络请求的次数,降低网络传输的开销。
  2. 提高吞吐量:单次请求发送多条消息,提高系统的消息处理能力。
  3. 减少资源消耗:减少对服务器资源的占用,降低系统的资源消耗。
  4. 优化存储:批量消息可以优化存储结构,减少存储空间的占用。

(3)如何使用批量消息

在RocketMQ中使用批量消息,需要注意以下几个步骤:

  1. 消息打包:将多条消息组装成一个批次,RocketMQ客户端提供了相应的API来支持批量操作。

  2. 发送批量消息

    • 使用sendBatchMessage方法发送批量消息。
    • 在发送批量消息时,需要指定消息的批次大小和消息列表。
  3. 接收批量消息

    • 消费者通过普通的消费方式接收批量消息。
    • RocketMQ会自动解包批量消息,消费者无需特殊处理。

以下是一个批量消息发送的示例代码:

// 创建消息列表
List<Message> messages = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    Message msg = new Message(\TopicTest\ \TagA\ \OrderID188\ \This is a batch message \concat(String.valueOf(i)).getBytes(RemotingCommand.DEFAULT_CHARSET));
    messages.add(msg);
}

// 发送批量消息
SendResult sendResult = producer.sendBatchMessage(messages);
System.out.println(sendResult);

(4)批量消息的注意事项

在使用批量消息时,以下是一些需要注意的事项:

  1. 消息大小限制:批量消息的总大小不能超过的配置限制,否则会导致发送失败。

  2. 消息顺序:批量消息内部的消息顺序可能会被打乱,如果业务需要保证顺序,则不应使用批量消息。

  3. 异常处理:批量消息发送可能会遇到部分消息发送失败的情况,合理处理发送异常。

  4. 性能测试:在使用批量消息前,建议进行性能测试,以确定最佳的批次大小和发送频率。

(5)批量消息的使用场景

批量消息适用于以下场景:

  1. 大数据处理:在处理大量数据时,批量消息可以减少网络请求次数,提高处理效率。

  2. 日志收集:在日志收集系统中,批量发送日志消息可以降低网络和存储的压力。

  3. 异步处理:在异步处理任务时,批量消息可以减少对异步队列的访问次数,提高任务处理的效率。

批量消息是RocketMQ提供的一项重要特性,它通过优化消息的发送和接收过程,帮助用户构建更加高效、可靠的分布式消息系统。合理利用批量消息,可以在保证业务需求的同时,提升系统的整体性能。在部署和运维RocketMQ时,理解和掌握批量消息的使用方法,对于提升消息处理的效率和系统的稳定性具有重要意义。

五、RocketMQ运维管理

1、监控与运维工具

在分布式系统中,监控和运维是确保系统稳定运行的关键环节。RocketMQ提供了一系列的监控与运维工具,帮助开发者和运维人员有效地管理消息队列,及时发现并解决问题。

(1)监控与运维工具概述

RocketMQ的监控与运维工具主要包括以下几个方面:

  1. RocketMQ Console:一个可视化的管理控制台,用于管理和监控RocketMQ集群。
  2. RocketMQ CLI:命令行工具,提供了丰富的命令来管理RocketMQ集群。
  3. RocketMQ OpenAPI:一组RESTful API,允许用户通过编程方式管理RocketMQ集群。
  4. RocketMQ Ons-Client:客户端工具,用于与RocketMQ集群进行交互。

(2)RocketMQ Console

RocketMQ Console是一个基于Web的管理控制台,它提供了以下功能:

  1. 集群管理:查看集群状态、配置信息,执行集群的启停操作。
  2. 主题管理:创建、删除主题,查看主题的详细信息,包括消息队列的数量、存储容量等。
  3. 消费者管理:查看消费者的消费状态,包括消费进度、延迟情况等。
  4. 消息查询:根据消息ID、时间戳等条件查询消息。
  5. 运维操作:执行消息重发、死信队列处理等运维操作。

(3)RocketMQ CLI

RocketMQ CLI是一个命令行工具,它提供了以下命令:

  • mqadmin:用于管理RocketMQ集群的命令,包括集群状态查询、主题管理、消费者管理等。
  • mqbroker:用于管理Broker的命令,包括启动、停止、重启等。
  • mqnamesrv:用于管理NameServer的命令,包括启动、停止、重启等。

以下是一些常用的mqadmin命令示例:

# 查看集群状态
mqadmin clusterList

# 查看主题信息
mqadmin topicList

# 查看消费者信息
mqadmin consumerList

# 查看消息轨迹
mqadmin viewMessage

(4)RocketMQ OpenAPI

RocketMQ OpenAPI提供了一组RESTful API,允许用户通过编程方式管理RocketMQ集群。以下是一些常用的API接口:

  • /topic/get:获取主题信息。
  • /topic/update:更新主题配置。
  • /consumer/get:获取消费者信息。
  • /consumer/update:更新消费者配置。
  • /message/get:获取消息详情。

使用OpenAPI,用户可以轻松地集成RocketMQ的管理功能到自己的系统中,实现自动化运维。

(5)RocketMQ Ons-Client

RocketMQ Ons-Client是一个Java客户端工具,它提供了以下功能:

  1. 消息发送:发送同步消息、异步消息、批量消息等。
  2. 消息接收:接收消息,支持顺序消费、批量消费等。
  3. 消息查询:根据消息ID查询消息。
  4. 消息重发:重发消息,用于处理消费失败的情况。

Ons-Client的API设计简单明了,易于使用,是开发者和运维人员的得力助手。

(6)监控与运维的最佳实践

在使用RocketMQ的监控与运维工具时,以下是一些最佳实践:

  1. 定期检查:定期检查集群状态,确保所有组件正常运行。
  2. 监控预警:设置合理的监控预警阈值,及时发现异常情况。
  3. 自动化运维:利用OpenAPI和CLI工具实现自动化运维,提高运维效率。
  4. 文档记录:详细记录运维操作和集群变更,便于问题追踪和回溯。
  5. 性能测试:定期进行性能测试,了解系统的性能瓶颈,及时优化。

通过合理使用RocketMQ的监控与运维工具,运维人员可以更加高效地管理消息队列,确保系统的稳定性和可靠性。这些工具不仅提供了实时的监控数据,还支持自动化运维,大大减轻了运维人员的工作负担。

2、性能优化

(1)系统调优

RocketMQ作为一个高性能的消息队列中间件,其性能优化至关重要。系统调优是性能优化的第一步,主要包括操作系统层面的优化和JVM层面的优化。

操作系统层面

在操作系统层面,以下是一些常见的优化措施:

  • 文件系统:使用ext4或XFS文件系统,这两种文件系统对于高并发写操作有更好的性能。
  • 磁盘I/O:使用SSD磁盘,提高I/O性能。同时,调整I/O调度策略,例如使用deadline或noop。
  • 网络配置:优化网络参数,如调整TCP窗口大小、开启TCP offload等,减少网络延迟和拥塞。
  • 系统参数:调整系统参数,如文件描述符限制、最大进程数等,确保系统资源足够。
JVM层面

在JVM层面,以下是一些常见的优化措施:

  • 堆内存:合理配置堆内存大小,避免频繁的Full GC。通常建议将堆内存设置为物理内存的50%左右。
  • 收集器:选择合适的垃圾收集器,如CMS或G1,根据应用场景和硬件条件进行选择。
  • 类加载:优化类加载机制,类加载时间和内存消耗。
  • 线程池:合理配置线程池大小,避免创建过多的线程导致上下文切换开销。

(2)消息队列优化

消息队列的优化是RocketMQ性能优化的核心,以下是一些关键点的优化措施:

主题与队列
  • 主题数量:合理规划主题数量,避免过多主题导致内存和CPU资源的浪费。
  • 队列数量:每个主题下的队列数量应与消费者的数量相匹配,以提高并行处理能力。
消息大小
  • 消息大小:控制消息大小,避免发送过大的消息导致网络和存储的压力增大。
消息发送
  • 批量发送:使用批量发送消息的方式,减少网络传输次数和消息存储开销。
  • 异步发送:采用异步发送消息,提高消息发送的吞吐量。
消息消费
  • 消费线程:合理配置消费者线程数,避免过多线程竞争导致性能下降。
  • 消费模式:选择合适的消费模式,如顺序消费或批量消费,根据业务需求进行优化。

(3)存储优化

RocketMQ的存储优化主要针对消息的持久化和检索,以下是一些优化措施:

消息存储
  • 存储引擎:选择合适的存储引擎,如使用LSM树结构的存储引擎,提高写操作的效率。
  • 优化:优化消息索引机制,提高消息检索的速度。
消息清理
  • 清理策略:合理配置消息清理策略,如定期清理过期消息,释放存储空间。
  • 清理频率:调整清理频率,避免在业务高峰期进行清理操作。

(4)网络优化

网络优化是RocketMQ性能优化的另一个重要方面,以下是一些优化措施:

网络架构
  • 负载均衡:使用负载均衡技术,如DNS轮询或IP哈希,确保网络请求均匀分布到各个节点。
  • 多路径路由:利用多路径路由技术,提高网络的可靠性和吞吐量。
网络传输
  • TCP优化:优化TCP参数,如调整TCP窗口大小、开启TCP offload等。
  • 压缩传输:对消息进行压缩传输,减少网络传输数据量。

(5)监控与诊断

监控与诊断是性能优化的持续过程,以下是一些关键点的监控与诊断措施:

监控工具
  • 系统监控:使用系统监控工具,如Prometheus、Grafana等,实时监控系统资源使用情况。
  • 应用监控:使用应用监控工具,如Zipkin、SkyWalking等,追踪应用性能瓶颈。
日志分析
  • 日志记录:详细记录系统运行日志,包括错误日志、性能日志等。
  • 日志分析:定期分析日志,发现潜在的性能问题。
压力测试
  • 压力测试:定期进行压力测试,模拟高并发场景,测试系统的极限性能。
  • 性能分析:分析压力测试结果,找出系统的性能瓶颈。

通过上述的性能优化措施,可以显著提升RocketMQ的性能,确保消息队列系统在高并发、高负载环境下稳定运行。性能优化是一个持续的过程,需要根据系统的实际运行情况不断调整和优化。

3、故障排查与处理

在RocketMQ的运维管理中,故障排查与处理是保证系统稳定运行的关键环节。

(1)日志分析

日志是故障排查的黄金线索,以下是日志分析的一些关键步骤:

  • 查看启动日志:检查RocketMQ服务的启动日志,查看是否有错误信息或异常提示。
  • 分析运行日志:定期查看运行日志,关注异常信息和警告信息,这些可能是故障的早期迹象。
  • 日志级别调整:根据需要调整日志级别,以便更详细地追踪问题。
  • 日志聚合:使用日志聚合工具,如ELK(Elasticsearch、Logstash、Kibana)或Fluentd,集中管理日志,便于查询和分析。

(2)监控指标检查

监控指标可以实时反映系统的运行状态,以下是一些重要的监控指标:

  • CPU使用率:检查CPU使用率是否异常,高CPU使用率可能导致系统响应缓慢。
  • 内存使用率:监控内存使用情况,避免内存溢出或内存泄漏。
  • 磁盘I/O:观察磁盘I/O情况,异常的I/O可能导致消息存储和检索性能下降。
  • 网络流量:监控网络流量,异常的网络流量可能表明网络攻击或配置错误。

(3)消息队列检查

消息队列的状态直接影响消息的发送和接收,以下是一些检查方法:

  • 消息积压:检查是否有消息积压现象,积压可能是由于消费者处理速度慢或生产者发送消息过快造成的。
  • 消息顺序:验证消息顺序是否正确,尤其是在顺序消息的场景下。
  • 消息大小:检查消息大小是否合规,过大的消息可能导致存储和传输问题。

(4)系统配置检查

系统配置错误可能导致各种问题,以下是一些配置检查要点:

  • 网络配置:检查网络配置,如防火墙规则、网络接口配置等。
  • 存储配置:检查存储配置,如磁盘挂载点、存储引擎配置等。
  • JVM参数:检查JVM启动参数,确保堆内存、垃圾收集器等配置合理。

(5)集群状态检查

对于集群模式的RocketMQ,以下是一些集群状态检查方法:

  • 节点状态:检查所有节点的状态,确保所有节点正常运行。
  • 负载均衡:验证负载均衡是否正常工作,确保请求均匀分布到各个节点。
  • 数据同步:检查数据同步状态,确保所有节点上的数据一致。

(6)常见故障处理

以下是一些RocketMQ中常见的故障及其处理方法:

  • 消息发送失败:检查网络连接、生产者配置和消息格式是否正确。
  • 消息消费延迟:分析消费者处理逻辑,优化消费速度,或增加消费者数量。
  • 服务启动失败:查看启动日志,检查系统配置和依赖服务是否正常。
  • 磁盘空间不足:清理过期消息,或增加存储空间。
  • 网络异常:检查网络设备,重启网络服务,或联系网络提供商。

(7)故障预防

除了故障排查与处理,预防故障同样重要:

  • 定期检查:定期进行系统检查,包括硬件、网络、存储等。
  • 备份策略:制定数据备份策略,确保数据安全。
  • 压力测试:定期进行压力测试,模拟高负载情况,测试系统稳定性。
  • 监控告警:设置监控告警,及时发现异常并处理。

通过上述故障排查与处理方法,运维人员可以更加有效地管理RocketMQ系统,确保消息队列服务的稳定性和可靠性。在处理故障时,快速响应和准确的定位问题是关键,这需要运维人员具备扎实的RocketMQ知识和丰富的实践经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奔跑吧邓邓子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值