Spring Cloud Alibaba 教程 | RocketMQ(一):快速入门

RocketMQ概述

RocketMQ是一款由阿里研发的高性能高可靠性的分布式消息队列,使用Java语言开发,该项目已经贡献给了Apache基金会,成为Apache的顶级开源项目。

在早期,阿里内部使用ActiveMQ作为其消息传递中间件,随着业务的快速增长,基于ActiveMQ的消息队列集群在处理大规模业务吞吐量时会遇到IO等性能瓶颈,阿里研发团队曾努力优化ActiveMQ,但无奈效果不理想,紧接着他们将目光投向Kafka,不幸的是Kafka并不能满足他们的要求, 特别是在低延迟和高可靠性方面。在这种情况下,阿里研发团队最终决定自己研发一个消息队列引擎来处理更广泛的使用场景,包括从传统的发布/订阅到大批量高实时、消息零丢失的交易系统。并且将该方案向社区开放,希望可以服务更多的企业。

RocketMQ官方网址:http://rocketmq.apache.org/

目前已经有超过100家企业其业务中使用RocketMQ,下图是部分使用到RocketMQ的大厂:
在这里插入图片描述
下图是RocketMQ团队编写的主流消息队列对比图:
在这里插入图片描述

消息队列的优点

简单来说,消息队列就是一种“先进先出”的数据结构,框架在此基础上实现数据传输的高性能、消息的高可靠性和系统高可用性,所以在如今微服务大行其道的背景下,分布式消息队列可以提供异步、解耦和消峰等功能,已经成为大型互联网服务架构里不可或缺的中间件。

  • 异步:在大型电商系统,通常会将各个核心功能拆分成独立的服务模块,用户的下单操作需要多个服务模块共同完成,如果此时订单服务要一直等到其他服务的操作完成,那么整个下单操作耗时将很长,用户体验会很差。所以通常的做法就是订单服务将数据生成后发送到消息队列之后立刻返回下单成功给用户,其他依赖服务从消息队列里面获取数据进行延后处理,这种延后的异步功能能够提升系统的性能和吞吐量,同时不至于让用户长时间等待。
    在这里插入图片描述
  • 解耦:很多大型企业里面通常会有很多的子系统,子系统之间当需要进行消息通讯时,可以通过在子系统之间架设消息队列,这样每个子系统只需要关心自己订阅的数据,子系统之间达到完全解耦,甚至各个子系统实现的语言、技术、架构等等都可以不一样。
    在这里插入图片描述
  • 消峰:每年的双十一,淘宝系统都会面临瞬间大规模流量的冲击,如果没有缓冲机制,是不可能支撑得住的。通过利用消息队列,把大量的用户请求暂存起来,接着服务依次从队列里面将请求取出处理,虽然用户的请求耗时变长了,但相比较于系统崩溃导致的请求失败来说,这实际上已经是提高了用户体验,并且最重要的是保证了系统的稳定性。
    在这里插入图片描述

快速使用

1、Linux安装Java环境

JDK1.8下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
在这里插入图片描述
作者之前下载的是: jdk-8u211-linux-x64.tar.gz

执行解压和拷贝:

tar -zxvf jdk-8u211-linux-x64.tar.gz
mv jdk1.8.0_211/ /usr/java1.8/

配置环境变量:

vim /etc/profile

JAVA_HOME=/usr/java1.8
JRE_HOME=/usr/java1.8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

source /etc/profile

验证是否安装成功:

[root@test usr]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

2、Linux安装RocketMQ

RocketMQ下载地址: http://rocketmq.apache.org/dowloading/releases/

在这里插入图片描述
作者下载的是:rocketmq-all-4.5.0-bin-release.zip

执行解压命令:

unzip rocketmq-all-4.5.0-bin-release.zip

配置RocketMQ环境变量

#修改环境变量
vim /etc/profile

export ROCKETMQ_HOME=/home/software/rocketmq-all-4.5.0-bin-release
export PATH=$PATH:$ROCKETMQ_HOME/bin

#更新配置
source /etc/profile

修改JVM配置:修改rocketmq bin目录下的runserver.sh和runbroker.sh文件
在这里插入图片描述在这里插入图片描述
配置指定外网地址:在conf目录下添加broker.properties文件指定外网地址
在这里插入图片描述
防火墙开放三个端口:9876、10911、10909

firewall-cmd --add-port=9876/tcp --permanent
firewall-cmd --add-port=10911/tcp --permanent
firewall-cmd --add-port=10909/tcp --permanent
firewall-cmd --reload

启动nameServer:

[root@test home]# mqnamesrv -n "192.168.0.149" &
The Name Server boot success. serializeType=JSON

启动Broker:

[root@test rocketmq-all-4.5.0-bin-release]# mqbroker -n "192.168.0.149:9876" -c conf/broker.properties autoCreateTopicEnable=true &
The broker[DEFAULT_BROKER, 192.168.0.149:10911] boot success. serializeType=JSON and name server is 192.168.0.149:9876

关闭命令

sh bin/mqshutdown broker    //停止 broker
 
sh bin/mqshutdown namesrv   //停止 nameserver

3、编写生产者服务

public class SyncProducer {

    public static void main(String[] args) {
        try {
            DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName-1");
            producer.setNamesrvAddr("192.168.0.149:9876");
            //producer.setSendMsgTimeout(10*1000);
            producer.start();
            for(int i = 0; i < 100; i++){
                Message message = new Message("TopicTest","TagA",
                        ("Hello RocketMQ "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(message);
                System.out.println("sendResult:"+sendResult);
            }
            producer.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

4、编写消费者服务

public class PushConsumer {

    public static void main(String[] args) {
        try {
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ProducerGroupName-1");
            consumer.setNamesrvAddr("192.168.0.149:9876");
            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            consumer.subscribe("TopicTest","*");

            consumer.registerMessageListener((List<MessageExt> msgList,ConsumeConcurrentlyContext consumeConcurrentlyContext) -> {
                System.out.printf(Thread.currentThread().getName() + "Receive New Messages :" + msgList + "%n");
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            });
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

角色解析

在这里插入图片描述
上图是RocketMQ官方的集群架构图,可以看到整体上可以分为四个角色,分别是:NameServer、Broker、Producer、Consumer。这里先对它们进行一个简单介绍,后面会详细地介绍。

NameServer:

NameServer在消息队列中起到协调者的作用,Broker启动时会和NameServer建立长连接。

Broker:

Broker是RocketMQ的核心,通过它可以进行消息的接收、存储和拉去等功能,生产环境建议配备多台机器保证Broker的高可用性。

Producer:

消息队列的生产者,需要与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立连接。

Consumer:

消息队列的消费者,同样与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master,Slave建立连接;

安装Console监控平台

项目下载地址:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console

修改配置文件指定NameServer地址:
在这里插入图片描述
使用maven打包项目

mvn package -Dmaven.test.skip=true

启动项目

java -jar rocketmq-console-ng-1.0.0.jar

开放8080端口

[root@test ~]# firewall-cmd --add-port=8080/tcp --permanent 
success
[root@test ~]# firewall-cmd --reload 
success

访问监控平台

http://192.168.0.149:8080
在这里插入图片描述

关注公众号了解更多原创博文

Alt

发布了122 篇原创文章 · 获赞 127 · 访问量 93万+

猜你喜欢

转载自blog.csdn.net/u010739551/article/details/104388655