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

Rocketmq初识学习:入门教程与实战

标签:
中间件
概述

RocketMQ初识学习将带你了解RocketMQ这一强大的分布式消息中间件,包括其特点、应用场景及环境搭建。文章详细介绍了RocketMQ的安装步骤、启动服务以及验证安装成功的方法。通过本文,读者可以快速掌握RocketMQ的基本概念和操作方法。

Rocketmq简介

Rocketmq是什么

RocketMQ是由阿里巴巴开源的一个分布式消息中间件,它基于高可用设计,并提供了消息发布与订阅功能。RocketMQ具有强大的消息推送能力,适用于大规模分布式环境下的应用。它支持多种消息模式,能够实现异步解耦,极大地提高了系统的可扩展性和灵活性。

Rocketmq的特点与优势

RocketMQ具有以下特点和优势:

  • 高吞吐量:RocketMQ能够在极短时间内处理大量消息,确保系统在高峰期也能正常运行。
  • 高可靠性:RocketMQ支持消息持久化存储,确保消息不会因为系统故障而丢失。
  • 异步解耦:通过消息队列解耦生产者和消费者,提高系统的可维护性与扩展性。
  • 集群模式:支持分布式部署,实现负载均衡和容错,确保系统的高可用性。
  • 丰富功能:支持延迟消息、事务消息、顺序消息等高级特性,满足不同场景下的需求。

Rocketmq的应用场景

RocketMQ广泛应用于各种场景,如电商交易、金融支付、物流跟踪等。具体应用场景包括:

  • 订单系统:订单创建后,通过RocketMQ将订单信息推送给多个下游系统,实现订单的分发和处理。
  • 秒杀系统:在秒杀活动中,RocketMQ用于处理大量并发请求和保证交易的可靠性。
  • 日志采集:RocketMQ可以收集并传输日志数据到分析系统,提高日志处理的效率和可靠性。
  • 金融交易:在金融支付系统中,RocketMQ用于处理交易消息,确保交易的高可靠性和实时性。
Rocketmq环境搭建

下载Rocketmq

首先,访问RocketMQ的GitHub仓库或官网获取最新的RocketMQ版本,下载压缩包。

wget https://github.com/apache/rocketmq/releases/download/v4.9.3/rocketmq-all-4.9.3.zip

安装Rocketmq

下载完成后,解压RocketMQ压缩包。

unzip rocketmq-all-4.9.3.zip
cd rocketmq-all-4.9.3

启动Rocketmq服务

RocketMQ需要启动两个服务:Name Server和Broker。Name Server提供路由信息,Broker负责消息的存储和转发。

  1. 启动Name Server:
nohup sh bin/mqnamesrv &
  1. 启动Broker:
nohup sh bin/mqbroker -n localhost:9876 &

验证安装

可以通过以下命令检查RocketMQ是否启动成功:

tail -f ~/logs/rocketmqlogs/namesrv.log

如果看到类似以下内容,说明Name Server启动成功。

The Name Server boot success

同时,可以通过以下命令检查Broker是否启动成功:

tail -f ~/logs/rocketmqlogs/broker.log

如果看到类似以下内容,说明Broker启动成功。

The broker boot success
Rocketmq基本概念

消息模型

RocketMQ的消息模型主要包括生产者、消费者、消息队列和主题。

  • 生产者:负责创建并发送消息。
  • 消费者:从消息队列中接收并处理消息。
  • 消息队列:存储消息的地方。
  • 主题:消息分类的标识符。

名称服务器

名称服务器(Name Server)是RocketMQ中的一个服务,它不存储消息,而是提供路由信息。生产者和消费者通过Name Server获取Broker的地址信息,以实现消息的发送和接收。

消息队列与主题

  • 消息队列:消息存储和传输的通道。每个主题可以包含多个消息队列。
  • 主题:消息分类的标识符。生产者和消费者通过主题订阅消息。

生产者与消费者

  • 生产者:负责创建并发送消息到指定的主题。
  • 消费者:从指定的主题中接收并处理消息。
Rocketmq消息发送与接收

创建生产者

创建生产者需要配置生产者组和主题名称,并创建Producer实例。

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.topic.TopicValidator;

public class Producer {
    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("localhost:9876");
        try {
            producer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

发送消息

生产者发送消息到指定的主题。可以使用send方法发送消息。

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

public class Producer {
    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("localhost:9876");
        try {
            producer.start();
            Message msg = new Message("TopicTest", // topic
                    "TagA", // tag
                    "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET)); // body
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}

创建消费者

创建消费者需要配置消费者组和主题名称,并创建Consumer实例。

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeFromWhere;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;

public class Consumer {
    public static void main(String[] args) {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
        consumer.setNamesrvAddr("localhost:9876");
        consumer.subscribe("TopicTest", "*");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            msgs.forEach(msg -> {
                System.out.printf("Received message: %s, %s, %s, %s%n",
                        msg.getTopic(), msg.getQueueId(), msg.getQueueOffset(), new String(msg.getBody()));
            });
            return ConsumeOrderedSuccess.getInstance();
        });
        try {
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

消费消息

消费者从指定的主题中接收并处理消息。在上述消费者代码中,通过MessageListenerOrderly监听消息。当接收到消息后,打印消息内容。

import org.apache.rocketmq.client.consumer.listener.ConsumeOrderedSuccess;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;

public class Consumer {
    public static void main(String[] args) {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
        consumer.setNamesrvAddr("localhost:9876");
        consumer.subscribe("TopicTest", "*");
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
            msgs.forEach(msg -> {
                System.out.printf("Received message: %s, %s, %s, %s%n",
                        msg.getTopic(), msg.getQueueId(), msg.getQueueOffset(), new String(msg.getBody()));
            });
            return ConsumeOrderedSuccess.getInstance();
        });
        try {
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Rocketmq常用配置与优化

配置文件详解

RocketMQ的配置文件主要位于conf目录下,包括broker.confserver.propertieslogback.xml等。

  • broker.conf:Broker的配置文件,包括Broker名称、IP地址、端口号、日志路径等。例如:
broker.name=broker-a
broker.id=0
broker.clusterName=DefaultCluster
broker.addr=127.0.0.1
broker.ip=127.0.0.1
broker.port=10911
broker.logDir=/home/rocketmq/logs
  • server.properties:服务器的全局配置文件,包括端口号、监听地址等。例如:
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
brokerRole=ASYNC_MASTER
namesrvAddr=localhost:9876
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
storePathConsumeQueue=/home/rocketmq/store/consumequeue
storePathIndex=/home/rocketmq/store/index
logFile=logs/rocketmqlogs/broker.log
logLevel=INFO
  • logback.xml:日志配置文件,定义日志的格式和输出方式。例如:
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

消息持久化与消息重试

  • 消息持久化:RocketMQ支持消息持久化,确保消息不会因为系统故障而丢失。持久化消息可以设置为不可删除,直到被消费者消费。
  • 消息重试:RocketMQ支持消息重试机制,当消费者处理消息失败时,可以将消息重新发送到队列中。
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

public class Producer {
    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("localhost:9876");
        producer.setRetryTimesWhenSendFailed(3);
        try {
            producer.start();
            Message msg = new Message("TopicTest", // topic
                    "TagA", // tag
                    "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET)); // body
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}

性能调优

RocketMQ的性能调优主要包括以下几个方面:

  • Broker配置:调整Broker的内存和线程池大小。例如,可以设置store.flushInterval等参数来优化消息存储性能。
broker.memoryMaxUsedRatio=80
broker.sendMessageThreadPoolNums=16
broker.sendMessageThreadPoolMinNums=8
broker.store.flushInterval=5000
  • 客户端配置:调整客户端的发送和接收消息的并发数。例如,可以设置sendMsgTimeout等参数来优化客户端性能。
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

public class Producer {
    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("localhost:9876");
        producer.setSendMsgTimeout(3000);
        producer.setRetryTimesWhenSendFailed(3);
        try {
            producer.start();
            Message msg = new Message("TopicTest", // topic
                    "TagA", // tag
                    "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET)); // body
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}
  • 网络配置:优化网络带宽和延迟。例如,可以设置client.batchSendMaxMessageSize等参数来优化网络性能。
broker.networkClientMaxRequestSize=500000
broker.networkClientBatchSendMaxMessageSize=102400
Rocketmq常见问题与解决方案

常见错误与解决方法

  • 错误代码:NOT_FOUND:表示消息不存在。可能是生产者发送的消息已被删除或消费者已经消费了该消息。
  • 错误代码:OFFSET_ILLEGAL:表示消息队列偏移量非法。可能是消息队列的偏移量设置错误。
  • 错误代码:NOT_PERMISSION:表示没有权限。可能是权限设置错误或用户没有访问权限。

日志分析与调试技巧

RocketMQ的日志文件位于logs目录下,可以通过查看日志文件来定位问题。常用的日志文件包括broker.lognamesrv.log等。

tail -f ~/logs/rocketmqlogs/broker.log

系统稳定性与监控

  • 监控指标:RocketMQ提供了多种监控指标,包括消息发送量、消息接收量、队列长度、延迟时间等。
  • 监控工具:可以使用Prometheus、Grafana等工具进行监控和报警。
# 下载并安装Prometheus监控
wget https://github.com/prometheus/prometheus/releases/download/v2.33.0/prometheus-2.33.0.linux-amd64.tar.gz
tar -xvf prometheus-2.33.0.linux-amd64.tar.gz
cd prometheus-2.33.0.linux-amd64
./prometheus --config.file=prometheus.yml --web.enable-admin-api

通过以上步骤,可以确保RocketMQ的稳定运行并及时发现和解决问题。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消