RocketMQ入门教程(一):简介与安装

一:消息中间件的应用场景

1.1 异步解耦

一般一个系统中会有很多个微服务,当用户在下单系统中下单时,下单操作完成后还需要调用库存系统进行扣减库存,还会调用积分系统增加用户的积分,还会调用优惠券系统进行发放优惠券等等一系列的操作,如果在下单系统中同步调用库存系统、同步调用积分系统、同步调用优惠券系统势必会导致整个下单时间会比较长,不利于用户体验。假如在同步调用的过程中一旦有一个微服务出现问题就会导致整个下单失败,也不利于用户的体验。

为了加快整个下单的速度,为了减少其它微服务出现问题而导致整个下单功能不可用,我们可以将所有的同步调用方式改为异步,当下单系统中的所有操作都处理完只需要发一个消息,让库存系统、积分系统、优惠券系统 都监听这个消息,然后分别在各自系统中处理响应的逻辑。当其它微服务出现问题时而不会影响下单流程,这就是异步解耦。

1.2 流量消峰

我们系统的QPS不是一天24小时不变的,比如可能在做促销、秒杀场景下QPS会一下子成倍增长,如果我们的服务器处理不过来可以考虑增加服务器数量来提高QPS,但是当活动结束后这些增加的服务器就会被闲置下来,导致服务器浪费,而且增加服务器也要有一定的成本。

虽然服务器可以通过增加数量来解决,但是一般数据库的性能不太容易大幅度的提升的,当QPS很高时MySQL也会被压垮。我们也可以流量限流,超过能处理的QPS就拒绝用户的请求,这样对用户体验不好。我们也可以搞一个消息队列,用户的所有请求都发到消息队列,然后系统去消费队列,然后将结果异步的通知给用户。

例如:小米新机在发售时就会有很多人在抢,当用户下单时我们将下单消息发送到队列中,然后给用户提示排队抢购中,下单系统去消费队列中的消息,然后将抢购的结果异步通知给用户,从而实现流量肖峰。

8694a4c27d1ed21b79b2413caf6eddc450da3feb

二:常用MQ产品比较

目前企业中主要用的MQ有ActiveMQ、RabbitMQ、RocketMQ、Kafka,

  • ActiveMQ一般都是老项目使用较多,新项目几乎都不会使用。
  • RabbitMQ 企业中使用的也挺多,功能也挺多。
  • RocketMQ 新兴的消息中间件,国内逐渐开始使用,并结合Spring Cloud Alibaba技术使用的越来越多。
  • Kafka 一般大数据使用的较多,吞吐量大,但是功能相对单一。
    在这里插入图片描述

三:RocketMQ 基本组成

RocketMQ(https://rocketmq.apache.org/docs/quick-start/)是阿里巴巴团队使用java语言开发的一款分布式消息中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列,经受了双11的严峻挑战。

RocketMQ由四大核心模块组成:

  • producer(生产者)
  • consumer(消费者)
  • brokerServer
  • nameServer

其中brokerServer和nameServer是rocketmq的服务端,两者一起独立的对外提供服务;而producer和consumer可看做是rocketmq的客户端,一般依附于业务应用程序。

1506329-20190918103312324-1707853339

3.1 Producer(生产者)

producer负责发送消息。使用producer将消息发送到brokerServer,消费者将从brokerServer中获取消息。

RocketMQ支持多种消息发送方式,如同步消息发送异步回调消息发送顺序消息发送延迟消息单向消息发送(异步无回调)。除了单向消息发送,其余的发送方式均需要brokerServer返回发送结果的确认消息。特别的,RocketMQ支持发送事务消息(半消息),能一定程度上解决分布式事务的问题。

3.2 Consumer(消费者)

consumer 负责消费producer发送的消息。consumer会从brokerServer获取消息,并传递给应用程序。

RocketMQ使用的消息原语是At Least Once(至少一次成功消费),如果一定时间内没有接收到consumer消息确认消费的响应结果,会将同一条消息再次投递给consumer。RocketMQ采用ack机制保证消息的消费成功,所以consumer可能会多次收到同一条消息,需要consumer的业务方做好幂等防护。

从使用者的角度来看,consumer分为两种方式来获取信息。一种是推模式(push consume),推模式看起来像是brokerServer将消息推给了consumer;另一种是拉模式(pull consume),拉模式看起来像是consumer主动的去brokerServer拉取消息(实际上,推模式是基于拉模式实现的)。

3.3 BrokerServer

BrokerServer负责消息的接收,存储和分发,是rocketmq最核心,最重量级的组成部分。为实现高可用和高吞吐,brokerServer通常采用集群部署,共同对外提供服务。Broker分主节点(master)和从节点(slave),主节点主要是面向生产者一般用于写操作,从节点主要是面向消费者用于读操作。一个主节点可以有多个从节点,Broker是通过name来分组的,没组中又通过id来区分主从的,id为0表示主节点,非0表示从节点。

3.4 NameServer

NameServer负责提供路由元数据。例如,brokerServer通常是集群部署的,其拓扑结构会经常的发生变化。如果每次集群中broker机器的上下线都需要通知所有的消费者、生产者,效率太低。

因此,rocketmq引入了nameServer作为brokerServer路由信息的维护者,broker的每次上下线都和nameServer通信,由nameServer来维护broker的路由信息,而producer和consumer通过访问nameServer获得对应broker的访问地址后,再向对应的broker发起请求。

nameServer解除了broker和客户端的耦合依赖关系,大大提高了效率。nameServer同样能以集群形式对外提供服务,集群内的nameServer服务器并不会互相通信,而是保持相互独立。如果将BrokerServer看做是一个微服务,那么NameServer就是注册中心,生产者发送消息需要从NameServer获取一个可用的BrokerServer,然后再往该BrokerServer中发送消息。

四:RocketMQ基本概念模型

4.1 Topic(主题)

Topic表示主题的意思,用于表示一类消息的分类名称或者说是一类消息对应的分类编码,生产者在发送消息时都必须指定一个Topic(分类),消费者通过指定分类来表示要具体消费那种消息。Topic就是消息的分类。

4.2 Tag(标签)

如果说Topic用分类来表示,一般分类可能还会有具体的子类或者称为二级分类,那么Tag就是Topic的二级分类,或者理解为二级Topic。Tag用于对消息再次进行具体细致的分类。

4.3 Message(消息)

message消息是rocketmq中传递消息的主体,一般是个JSON字符串,生产者会将该JSON字符串发送到BrokerServer中,消费者会通过BrokerServer获取该JSON字符串来处理业务逻辑。

4.4 Message Queue(消息队列)

消息队列是消息的家,用来存储消息的地方。每个Topic默认都会分配4个Message Queue用于存储该Topic下的Message。

4.5 Group(组)

组分为 消费者组(consumer group)和 生产者组(producer group)两种。消费者组和生产者组之间没有任何关联(即使组名一样)。只需要为生产者或者消费者定义一个组名即可,组名相同的就是一个集群。

一般一个微服务定义一个生产者组名即可,每个微服务的消费者可以定义自己的消费者组名。

4.6 集群(Clustering)消费/广播(Broadcasting)消费

集群消费和广播消费是消费的两种方式:

  • 集群消费:同一消费者组下的所有消费者共同瓜分消息,一个消息只能被一个消费者消费。

  • 广播消费:同一消费者组下的所有消费者都能消费到每一条消息,人人有份,不用抢,就像村里的大喇叭一样,广播一响所有人都能听得见。

五:RocketMQ单机安装

5.1 下载二进制文件

image-20210106153126383

5.2 启动Name Server服务

5.2.1 配置环境变量

vi ~/.bash_profile
export ROCKETMQ_HOME=/Users/mengday/Softwares/rocketmq-all-4.8.0-bin-release
source ~/.bash_profile

5.2.2 修改启动内存大小

RocketMQ默认内存较大(8g),启动Broker如果因为内存不足会导致启动失败,需要修改bin/runborker.sh和bin/runserver.sh两个文件,将JVM内存调小点,可根据自己机器内存大小情况调整。

image-20210106153809931

image-20210106154234143

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

5.2.3 创建日志文件

# 创建日志文件
> mkdir ~/logs/rocketmqlogs/
> cd ~/logs/rocketmqlogs/
> touch namesrv.log

5.2.4 启动 Name Server

# 启动
cd rocketmq-all-4.8.0-bin-release
nohup sh bin/mqnamesrv &

# 查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log

image-20210106160107721

5.3 启动Broker

# 启动
nohup sh bin/mqbroker -n localhost:9876 &

# 查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log 

image-20210106160641925

# 查看服务是否启动成功
jps
12420 BrokerStartup
12344 NamesrvStartup
# 关闭NameServer
sh bin/mqshutdown namesrv
# 关闭Borker
sh bin/mqshutdown broker

5.4 测试发送数据和接收数据

RocketMQ已经为我们提供了好了测试代码。发送消息和接收消息都需要配置环境变量NAMESRV_ADDR。

export NAMESRV_ADDR=localhost:9876
# 发送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

image-20210106163103623

export NAMESRV_ADDR=localhost:9876
# 接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

image-20210106163232732

六:集群搭建

一旦系统中引入MQ,那么保证MQ的可用性是重中之重,所以生产环境都是集群的环境。

集群搭建有几种模式:

  1. 多master没有slave
  2. 多master多slave(同步):消息发送到master节点并写入磁盘后,然后再将消息同步到slave节点写入磁盘,等slave写入磁盘后再返回生产者的发送结果。同步适用于对安全性要求苛刻的场景。
  3. 多master多slave(异步):消息发送到master节点并写入磁盘后就会立即将发送结果返回给生产者,而主节点上的消息会异步的去写入到slave节点上。异步效率更高

6.1 NameServer集群

NameServer集群之间没有联系相互独立,所以不需要任何配置,只需要启动多个NameServer服务即可。

6.2 BrokerServer集群

Broker集群配置文件在conf目录下,提供了多种集群模式的默认配置:

  • 2m-2s-async:双主双从(异步)
  • 2m-2s-sync:双主双从(同步)

broker-a.properties:不带s的表示master,broker-a-s.properties:带s的表示slave。

# 所属集群的名字
brokerClusterName=DefaultCluster
# Broker的名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
# 0表示master, >0表示slave
brokerId=0
# nameServer地址,逗号分隔
namesrvAddr=localhost:9876,localhost:9877
# Broker对外服务的监听的端口号
listenPort=11011
# topic默认创建的消息队列数量
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

6.3 启动NameServer集群

启动 NameServer集群 和单节点启动完全一样,只需要在每个节点上启动对应的NameServer即可。

nohup sh bin/mqnamesrv &

6.4 启动BrokerServer集群

启动BrokerServer集群需要指定配置文件。

nohup sh bin/mqbroker -c ~/Softwares/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-a.properties &
nohup sh bin/mqbroker -c ~/Softwares/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-a-s.properties &

nohup sh bin/mqbroker -c ~/Softwares/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-b.properties &
nohup sh bin/mqbroker -c ~/Softwares/rocketmq-all-4.8.0-bin-release/conf/2m-2s-async/broker-b-s.properties &

# 查看进程, 如果有NamesrvStartuphe BrokerStartup就表示启动成功了
jps
NamesrvStartup
BrokerStartup

6.5 mqadmin命令

mqadmin命令用于管理RocketMQ,使用命令比较麻烦,RocketMQ提供一套Web UI来做相应的操作。

七:RocketMQ 控制台

7.1 下载控制台

下载rocketmq-console https://github.com/apache/rocketmq-externals/ ,这是一个Spring Boot Web项目 。

image-20210106181552719

7.2 启动控制台

启动rocketmq-console,可以在IDEA中直接启动,也可以先打包成jar,然后再使用 java -jar 启动。启动之前可以修改application.properties中的一些参数。

server.port=8080
# 注意:如果nameserver有多个有分号;分割而不是逗号
rocketmq.config.namesrvAddr=localhost:9876

image-20210106183358582

mvn clean package -Dmaven.test.skip=true

java -jar rocketmq-console-ng-2.0.0.jar

7.3 访问控制台

访问WebUI http://localhost:8080/ 可以查看Topic、Producer、Consumer、Message等。

image-20210106183445492

image-20210106183614134

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值