RocketMQ的安装和配置

一、RocketMQ 的介绍

  1. RocketMQ

    Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。

  2. RocketMQ 概念

    • Producer(生产者):
      生产者负责生成并发送消息到消息队列。通常,生产者是业务系统的组件,例如订单处理系统生成订单消息并发送到队列中。
    • Consumer(消费者):
      消费者从消息队列中获取并处理消息。消费者可以是多个,并且可以分为两种类型:
      Push Consumer:主动接收消息。
      Pull Consumer:主动从队列中拉取消息。
    • Topic(主题):
      Topic 是消息的逻辑分类,每个 Topic 代表一个消息类别。生产者将消息发送到特定的 Topic,消费者订阅并消费特定 Topic 下的消息。
    • Message(消息):
      消息是 RocketMQ 传输的最小单位。消息体可以是任意的字节数组,通常为 JSON、XML 或其他序列化格式。
    • Broker(消息代理):
      Broker 是消息中间件的核心组件,负责接收、存储、转发消息。Broker 通过 Topic 和队列管理消息,并确保消息的可靠传输。
    • NameServer:
      NameServer 是轻量级的服务发现和路由管理组件,Broker 和生产者、消费者通过它来发现彼此的地址,并完成消息的路由。
    • Queue(队列):
      每个 Topic 可以有多个队列(Partition),消息会根据一定的策略分发到不同的队列中。多个消费者可以并行消费同一个 Topic 下的不同队列,提高吞吐量。
    • Tag(标签):
      Tag 是用于对消息进行进一步分类的标记,帮助消费者过滤消息。例如,在一个 Topic 下,可以根据不同的标签过滤出特定类型的消息进行消费。
    • Order Message(顺序消息):
      顺序消息是 RocketMQ 提供的一种消息投递方式,保证同一生产者发送的消息按顺序到达同一消费者。
    • Transactional Message(事务消息):
      RocketMQ 支持分布式事务消息。生产者可以发送半消息(half message),消费者暂时不会消费,直到生产者确认事务提交,RocketMQ 才会将消息推送给消费者。
  3. 为什么 RocketMQ

    在阿里孕育 RocketMQ 的雏形时期,我们将其用于异步通信、搜索、社交网络活动流、数据管道,贸易流程中。随着我们的贸易业务吞吐量的上升,源自我们的消息传递集群的压力也变得紧迫。
    根据我们的研究,随着队列和虚拟主题使用的增加,ActiveMQ IO 模块达到了一个瓶颈。我们尽力通过节流、断路器或降级来解决这个问题,但效果并不理想。于是我们尝试了流行的消息传递解决方案 Kafka。不幸的是,Kafka 不能满足我们的要求,其尤其表现在低延迟和高可靠性方面,详见下文。在这种情况下,我们决定发明一个新的消息传递引擎来处理更广泛的消息用例,覆盖从传统的 pub/sub 场景到高容量的实时零误差的交易系统。
    Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

二、RocketMQ 的安装

  1. 本地部署
    下载地址

    • Window
      下载完后解压到自定义目录,MQ 解压路径\rocketmq-all-5.3.0-bin-release;

      注意 (Windows11 系统解压路径不要出现空格)

      注意 ( 同时安装的 jdk 路径也不能有空格,不然会提示启动 NameServer 会出现“此时不应有 XXXX”XX:JDK 路径)

      配置环境变量
      配置环境变量,变量名:ROCKETMQ_HOME 变量值:(你的解压路径);path 后追加;%ROCKETMQ_HOME%\bin
      系统环境变量
      启动 NameServer
      可启动 cmd 命令执行进入至‘安装的 MQ 目录\bin’下,执行命令‘start mqnamesrv.cmd’,启动 NAMESERVER。成功后会弹出提示框;
      或直接使用 mqnamesrv.cmd 双击运行

      //RockerMQ 配置 Broker 密码
      在 rocketMQ 安装目录下的 conf 文件夹-broker.conf,设置
      brokerPermission=password //开启密码

      plainTextAccessKey=root //设置账户名
      plainTextSecretKey=123456 //设置密码

      启动 Broker
      在安装目录 bin 下 cmd

      1
      $ start mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true

      进入至‘MQ 文件夹\bin’下,修改 runbroker.cmd 中 JVM 占用内存大小
      修改JVM内存
      启动后窗口不可关闭。也可以看设置服务启动。

      rocketmq 控制台安装及配置
      下载地址
      解压后,修改源码中 src 里面的 application.properties 配置文件 端口号:19876(防止端口冲突 9876 为 mq 端口)
      同时添加密码检验,如果没有设置密码则不用修改

      1
      2
      3
      4
      #set the accessKey and secretKey if you used acl
      rocketmq.config.accessKey=root
      rocketmq.config.secretKey=123456
      rocketmq.config.useTLS=true
    1
    2
    3
    4
    进入解压根目录执行 mvn 打包命令

    ```shell
    mvn clean package -Dmaven.test.skip=true

    生成的 target 下将有 rocketmq-dashboard-1.0.0.jar 包。
    RocketMQ 注册为 Windows 服务
    下载地址
    选中下载

    在 RocketMQ 目录上新建文件夹 admin,并将上述生成的 rocketmq-dashboard-1.0.0.jar 包放入其中

    同时在根目录新建文件 start.bat

    1
    2
    3
    start .\bin\mqnamesrv.cmd
    start .\bin\mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true
    java -jar .\admin\rocketmq-dashboard-1.0.0.jar

    文件目录
    nssm 下载后解压,选择相应的系统,并在目录上执行:nssm install RocketMQ
    选择
    添加window服务
    并确定即可启动服务

    • Linux
      这里以在 Linux 环境下利用社区 5.3.0 的源码包为例,介绍 RocketMQ 安装过程。
      解压 5.3.0 的源码包并编译构建二进制可执行文件

      1
      2
      3
      4
      $ unzip rocketmq-all-5.3.0-source-release.zip
      $ cd rocketmq-all-5.3.0-source-release/
      $ mvn -Prelease-all -DskipTests -Dspotbugs.skip=true clean install -U
      $ cd distribution/target/rocketmq-5.3.0/rocketmq-5.3.0

      启动服务

      1
      2
      3
      4
      5
      6
      ### 启动namesrv
      $ nohup sh bin/mqnamesrv &

      ### 验证namesrv是否启动成功
      $ tail -f ~/logs/rocketmqlogs/namesrv.log
      The Name Server boot success...
  2. Docker 部署 RocketMQ

    • 拉取 RocketMQ 镜像

      1
      docker pull apache/rocketmq:5.3.0
    • 创建容器共享网络

      1
      docker network create rocketmq
    • 启动 NameServer

      1
      2
      3
      4
      5
      # 启动 NameServer
      docker run -d --name rmqnamesrv -p 9876:9876 --network rocketmq apache/rocketmq:5.3.0 sh mqnamesrv

      # 验证 NameServer 是否启动成功
      docker logs -f rmqnamesrv
    • 启动 Broker+Proxy

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      # 配置 Broker 的IP地址
      echo "brokerIP1=127.0.0.1" > broker.conf

      # 启动 Broker 和 Proxy
      docker run -d \
      --name rmqbroker \
      --network rocketmq \
      -p 10912:10912 -p 10911:10911 -p 10909:10909 \
      -p 8080:8080 -p 8081:8081 \
      -e "NAMESRV_ADDR=rmqnamesrv:9876" \
      -v ./broker.conf:/home/rocketmq/rocketmq-5.3.0/conf/broker.conf \
      apache/rocketmq:5.3.0 sh mqbroker --enable-proxy \
      -c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf

      # 验证 Broker 是否启动成功
      docker exec -it rmqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"
  3. Docker Compose 部署 RocketMQ

    • 编写 docker-compose
      为了快速启动并运行 RockerMQ 集群,您可以使用以下模板通过修改或添加环境部分中的配置来创建 docker-compose.yml 文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    version: '3.8'
    services:
    namesrv:
    image: apache/rocketmq:5.3.0
    container_name: rmqnamesrv
    ports: - 9876:9876
    networks: - rocketmq
    command: sh mqnamesrv
    broker:
    image: apache/rocketmq:5.3.0
    container_name: rmqbroker
    ports: - 10909:10909 - 10911:10911 - 10912:10912
    environment: - NAMESRV_ADDR=rmqnamesrv:9876
    depends_on: - namesrv
    networks: - rocketmq
    command: sh mqbroker
    proxy:
    image: apache/rocketmq:5.3.0
    container_name: rmqproxy
    networks: - rocketmq
    depends_on: - broker - namesrv
    ports: - 8080:8080 - 8081:8081
    restart: on-failure
    environment: - NAMESRV_ADDR=rmqnamesrv:9876
    command: sh mqproxy
    networks:
    rocketmq:
    driver: bridge
    • 启动 RocketMQ 集群
      linux
    1
    docker-compose up -d

    window

    1
    docker-compose -p rockermq_project up -d

三、RocketMQ 的特点

  • 高吞吐量:RocketMQ 通过队列和分布式架构支持大规模并发消息处理,适用于高吞吐量的场景。
  • 低延迟:支持毫秒级的消息投递延迟,适合对时效性要求高的应用。
  • 高可用性和持久性:通过多副本机制和日志文件存储,保证消息在异常情况下不丢失,并能够快速恢复。
  • 消息的顺序性:支持消息按发送顺序消费,确保某些场景下的消息顺序不被打乱。
  • 分布式事务支持:RocketMQ 提供的事务消息,可以保证分布式系统中的数据一致性。

四、RocketMQ 的场景

  • 异步处理:例如订单处理系统,在订单生成后异步发送订单消息到消息队列,进行后续处理,如库存更新、通知等。
  • 事件驱动架构:利用消息队列实现微服务之间的解耦,通过事件触发服务间的通信。
  • 日志收集:在分布式系统中,消息队列可以用于日志的收集和聚合,方便后续分析和处理。
  • 流量削峰填谷:在高并发场景中,消息队列可以用来削峰填谷,将请求平滑地分发到后端处理。