RocketMQ

4 min

:dolls: RocketMQ

前言

RocketMQ 是一个消息队列系统,它的工作方式与 HTTP 不同。

  • 在 HTTP 中,客户端(如浏览器)会直接向服务器发送请求,并等待服务器的响应。

  • 在 RocketMQ 中,生产者(Producer)会将消息发送到 RocketMQ 的服务器,然后消费者(Consumer)可以从服务器接收这些消息。

    • RocketMQ 主要是作为一个消息传递的中转站

      img

  • 消息会被分为若干个topic

    • 一个topic会被分为多个分区queue

      • queue只会存简单的数据,完整的消息在commitLog文件中

        • 不同的queue会被布局在broker中,(可提高了并发性能)

        Screenshot_20240727_202603_tv.danmaku.bilibilihd

下载

创建用户定义的网络:

docker network create rocketmq-network

:one: RockerMQ—namesrv

  • 拉取镜像

    docker pull apache/rocketmq:latest
  • 构建容器

    docker run -d `
        --restart=always `
        --name rocketMQ-namesrv `
        --network rocketmq-network `
        -p 9876:9876 `
        -v C:\DockerData\rocketmq\data\namesrv\logs:/root/logs `
        -v C:\DockerData\rocketmq\data\namesrv\store:/root/store `
        -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" `
        -e "JAVA_OPTS=-Duser.home/opt" `
        apache/rocketmq `
        sh mqnamesrv

    参数解释

    • -d:以分离模式运行容器,即在后台运行。

    • --restart=always:设置容器在失败后自动重启。

    • --name rmqnamesrv:为容器指定一个名称 rmqnamesrv

    • -p 9876:9876:将主机的 9876 端口映射到容器的 9876 端口。

    • -v C:\DockerData\rocketmq\data\namesrv\logs:/root/logs:将主机目录 C:\docker\rocketmq\data\namesrv\logs 挂载到容器的 /root/logs 目录。

    • -v C:\DockerData\rocketmq\data\namesrv\store:/root/store:将主机目录 C:\docker\rocketmq\data\namesrv\store 挂载到容器的 /root/store 目录。

    • -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m":设置容器内的环境变量 JAVA_OPT_EXT,用于指定 Java 虚拟机的启动参数。

    • -e "JAVA_OPTS=-Duser.home/opt":设置容器内的环境变量 JAVA_OPTS,用于指定 Java 运行时的系统属性。

      • JAVA_OPT_EXT
        • -server:指示 JVM 使用服务器模式(通常会启用一些优化,以提高性能)。
        • -Xms128m:设置初始堆内存大小为 128 MB。
        • -Xmx128m:设置最大堆内存大小为 128 MB。
        • -Xmn128m:设置年轻代堆内存大小为 128 MB。
      • JAVA_OPTS
        • -Duser.home/opt:设置 Java 系统属性 user.home,这个属性用于指定用户目录。
    • apache/rocketmq:指定要使用的 Docker 镜像及其标签。

    • sh mqnamesrv:指定容器启动时要执行的命令。

:two: RocketMQ-dashboard

1. 拉取 RocketMQ Console 的 Docker 镜像

首先,你需要从 Docker Hub 拉取 RocketMQ Console 的官方镜像:

docker pull apacherocketmq/rocketmq-dashboard:latest

2. 运行 Docker 容器

使用以下命令运行 RocketMQ Console 容器,并配置 NameServer 地址等参数:

docker run -d `
    --restart=always `
    --name rocketMQ-dashboard `
    --network rocketmq-network `
    -p 8080:8080 `
    -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rocketMQ-namesrv:9876" `
    apacherocketmq/rocketmq-dashboard:latest

参数说明:

  • -p 9875:9875: 将容器的 9875端口映射到主机的 9875端口。你可以在浏览器中访问 http://localhost:9875 查看 RocketMQ Console。
  • -e "JAVA_OPTS=-Drocketmq.config.namesrvAddr=localhost:9876": 设置环境变量 JAVA_OPTS,指定 NameServer 的地址。你需要将 localhost:9876 替换为你的 RocketMQ NameServer 的实际地址。
  • --name rocketmq-console: 给容器命名为 rocketmq-console

3. 访问 RocketMQ Console

在浏览器中输入 http://localhost:8080 (或你的主机 IP 地址) 来访问 RocketMQ Console 界面。

:three:RockerMQ—broker 安装

docker run -d `
    --restart=always `
    --name rocketMQ-broker `
    --network rocketmq-network `
    -p 10911:10911 `
    -p 10909:10909 `
    -v C:\DockerData\rocketmq\broker\logs:/home/rocketmq/logs `
    -v C:\DockerData\rocketmq\broker\store:/home/rocketmq/store `
    -v C:\DockerData\rocketmq\broker\conf\broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf `
    -e "NAMESRV_ADDR=rockerMQ-namesrv:9876" `
    -e "MAX_POSSIBLE_HEAP=200000000" `
    apache/rocketmq `
    sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
  • broker.conf文件在容器内部

    • /home/rocketmq/rocketmq-5.2.0/conf
  • 修改配置文件 broker.conf,配置文件加上自动创建主题(broker默认为false)

    # 启用自动创建主题
    autoCreateTopicEnable=true
  • 我的程序是通过namesrv来获取broker的ip的,但是ip是docker内部的ip地址,这样就会导致我在主机运行的程序拿到的broker的ip访问不到.

    • 解决方法

       brokerIP1=192.168.3.140 // lan网络的ipv4

参考资料