为了账号安全,请及时绑定邮箱和手机立即绑定

Rocketmq安装项目实战教程

概述

本文详细介绍了RocketMQ安装项目实战的全过程,包括环境准备、安装步骤以及多个实战案例。通过这些内容,读者可以全面掌握RocketMQ的部署与应用。

RocketMQ简介
什么是RocketMQ

RocketMQ是由阿里巴巴开源的一款高性能分布式消息中间件,它是Apache软件基金会下的顶级项目。RocketMQ基于高可用设计,支持多副本、主备模式和故障转移,确保消息的可靠传递。同时,它具备高吞吐量和低延迟的特点,广泛应用于阿里巴巴集团的各个业务场景。

RocketMQ的特点和优势

RocketMQ具有以下特点和优势:

  1. 高可用性:支持多副本、主备模式和故障转移,保证消息的可靠传递。
  2. 高性能:支持高吞吐量和低延迟,可应对大量并发消息的处理。
  3. 分布式集群:可以扩展消息队列的规模,支持水平扩展。
  4. 消息轨迹:提供消息轨迹查询功能,便于排查问题。
  5. 消息过滤:支持多种消息过滤方式,如SQL过滤、Tag过滤等。
  6. 开放接口:提供Java、C++、Python等多种语言的SDK,便于集成。
  7. 灵活的路由策略:支持动态路由和静态路由配置,支持多种消息路由策略。
环境准备
操作系统和Java环境要求

安装RocketMQ之前,需要确保操作系统和Java环境符合以下要求:

  • 操作系统:建议使用Linux系统,支持CentOS、Ubuntu等。
  • Java环境:RocketMQ要求Java版本为JDK 1.8及以上。
下载RocketMQ

您可以从Apache RocketMQ的官方网站下载最新版本的RocketMQ。这里以RocketMQ 4.9.2版本为例进行演示。

下载地址:https://archive.apache.org/dist/rocketmq/

下载完成后,解压文件:

tar -zxvf rocketmq-all-4.9.2-bin-release.tar.gz
RocketMQ安装步骤详解
解压RocketMQ

解压RocketMQ安装包到指定目录,例如/opt/rocketmq

tar -zxvf rocketmq-all-4.9.2-bin-release.tar.gz -C /opt/rocketmq
配置环境变量

编辑系统的环境变量文件,例如/etc/profile,添加RocketMQ的环境变量:

export ROCKETMQ_HOME=/opt/rocketmq/rocketmq-all-4.9.2
export PATH=$PATH:$ROCKETMQ_HOME/bin

执行source /etc/profile使环境变量生效。

启动RocketMQ服务
  1. 启动NameServer:NameServer是RocketMQ的路由中心,提供注册服务:

    sh /opt/rocketmq/rocketmq-all-4.9.2/bin/mqnamesrv

    启动成功后,控制台会输出以下信息:

    The Name Server bootstrap finished, started successfully!!!
  2. 启动Broker:Broker是RocketMQ的消息存储和转发服务,支持多Broker节点配置:

    sh /opt/rocketmq/rocketmq-all-4.9.2/bin/mqbroker -n 127.0.0.1:9876

    启动成功后,控制台会输出以下信息:

    The broker[broker-a] boot successfully. My pid is [24669]
RocketMQ基本概念
命名空间与主题

命名空间(Namespace)是RocketMQ用于区分不同消息源和消费者的逻辑空间。每个消息主题都在一个特定的命名空间下。

主题(Topic)是消息类型的一个标识,用于标识一类消息。例如,在一个电商系统中,可以定义order主题用于订单消息,payment主题用于支付消息等。

生产者与消费者

生产者(Producer)负责发送消息到指定的主题,生产者可以是任何可以生成并发送数据的应用程序。

消费者(Consumer)负责接收并处理消息,消费者可以是任何可以消费消息的应用程序。

消息标签与消息过滤

消息标签(Message Tag)是消息的一个属性,可以用于标识消息的类别或类型。例如,可以使用不同的标签来区分不同类型的订单消息。

消息过滤:RocketMQ支持多种消息过滤方式,如SQL过滤、Tag过滤等。例如,可以根据不同的Tag来过滤消息。

RocketMQ项目实战
实战案例一:简单消息发送与接收

生产者代码示例

生产者代码如下:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

public class SimpleProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("127.0.0.1:9876");

        producer.start();

        Message msg = new Message("TopicTest", "TagA", "OrderID188", "Hello World".getBytes(RocketMQMessageBodyConstant.UTF_8));
        SendResult sendResult = producer.send(msg);
        System.out.println(sendResult);
        producer.shutdown();
    }
}

消费者代码示例

消费者代码如下:

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

public class SimpleConsumer {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
        consumer.setNamesrvAddr("127.0.0.1:9876");

        consumer.subscribe("TopicTest", "*");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

        consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println("Receive New Messages: " + new String(msg.getBody()));
            }
            return ConsumeOrderlyStatus.COMMIT_MESSAGE;
        });

        consumer.start();
    }
}
实战案例二:多消费者消息处理

生产者代码示例

生产者代码如下:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

public class MultiConsumerProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("127.0.0.1:9876");

        producer.start();

        for (int i = 0; i < 10; i++) {
            Message msg = new Message("TopicTest", "TagA", "OrderID188", ("Hello Message " + i).getBytes(RocketMQMessageBodyConstant.UTF_8));
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
        }

        producer.shutdown();
    }
}

消费者代码示例

消费者代码如下:

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

public class MultiConsumer {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("ConsumerGroupName1");
        consumer1.setNamesrvAddr("127.0.0.1:9876");

        consumer1.subscribe("TopicTest", "*");
        consumer1.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

        consumer1.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println("Consumer1 Receive New Messages: " + new String(msg.getBody()));
            }
            return ConsumeOrderlyStatus.COMMIT_MESSAGE;
        });

        DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("ConsumerGroupName2");
        consumer2.setNamesrvAddr("127.0.0.1:9876");

        consumer2.subscribe("TopicTest", "*");
        consumer2.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

        consumer2.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println("Consumer2 Receive New Messages: " + new String(msg.getBody()));
            }
            return ConsumeOrderlyStatus.COMMIT_MESSAGE;
        });

        consumer1.start();
        consumer2.start();
    }
}
实战案例三:消息过滤与路由

生产者代码示例

生产者代码如下:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

public class FilterProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("127.0.0.1:9876");

        producer.start();

        for (int i = 0; i < 10; i++) {
            Message msg = new Message("TopicTest", "TagA", "OrderID188", ("Hello Message " + i).getBytes(RocketMQMessageBodyConstant.UTF_8));
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
        }

        producer.shutdown();
    }
}

消费者代码示例

消费者代码如下:

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;

public class FilterConsumer {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
        consumer.setNamesrvAddr("127.0.0.1:9876");

        consumer.subscribe("TopicTest", "TagA");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

        consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println("Receive New Message: " + new String(msg.getBody()));
            }
            return ConsumeOrderlyStatus.COMMIT_MESSAGE;
        });

        consumer.start();
    }
}
常见问题及解决方法
常见错误与解决方法

错误1:NameServer启动失败

错误信息

Failed to start server.

解决方法

  • 检查是否已经启动过NameServer,可以通过ps命令查看是否有NameServer进程。
  • 确保NameServer配置文件conf/rocketmq.properties中的配置正确。
  • 确保端口9876没有被其他应用占用。

错误2:Broker启动失败

错误信息

Failed to start broker.

解决方法

  • 检查Broker配置文件conf/broker.properties中的配置是否正确。
  • 确保NameServer已经启动,并且Broker的namesrvAddr配置正确。
  • 确保Broker的端口没有被其他应用占用。

错误3:生产者或消费者发送/接收消息失败

错误信息

Message Send/receive Failed.

解决方法

  • 检查生产者或消费者的配置是否正确,例如namesrvAddrtopic等。
  • 确保NameServer和Broker服务已经启动并且运行正常。
  • 检查网络连接,确保生产者和消费者能够正常访问NameServer和Broker。
日志分析与调试技巧

RocketMQ提供了详细的日志记录,可以通过日志来分析和调试问题。

  • NameServer日志:位于logs/NameServer/目录下,可以查看NameServer的运行状态和错误信息。
  • Broker日志:位于logs/broker/目录下,可以查看Broker的运行状态和错误信息。
  • 客户端日志:客户端日志通常会在客户端的输出日志中显示,例如生产者和消费者的控制台输出。

常用的日志分析技巧:

  • 查看启动日志:查看NameServer和Broker的启动日志,确认服务是否启动成功。
  • 查看错误日志:查找日志中的错误信息,如ERRORException等。
  • 分析日志中的报错信息:根据报错信息定位问题,例如端口冲突、配置错误等。
  • 调试代码:在生产者和消费者代码中添加日志输出,帮助定位问题。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消