从阿里云到RocketMQ

前言

这几天闲来无事,突然想到自己还有一个云服务器,从去年双十一租来以后一直没怎么用,打开工作台,发现有一键部署幻兽帕鲁游戏的教程,兴冲冲地点进去,看到第二页就不想看了 1 而我只有一台2核2G的入门级ECS云服务器 1

Whatever,不管了,既然游戏服务器搭建不了,那就来搭建一个RocketMQ吧

RocketMQ

RocketMQ的应用场景

  • 应用解耦

系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

  • 流量削峰

应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。

一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。

  • 数据分发

通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可

RocketMQ架构

1

  • NameServer:我们可以同时部署很多台 NameServer 服务器,并且这些服务器是无状态的,节点之间无任何信息同步。 NameServer 起来后监听 端口,等待 Broker、Producer、Consumer 连上来,NameServer 是集群元数据管理中心。

  • Broker:Broker 启动,跟所有的 NameServer 保持长连接,每 30s 发送一次发送心跳包(像心跳一样持续稳定的发送请求)。心跳包中包含当前 Broker 信息 ( IP+ 端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。

  • Topic:收发消息前,先创建 Topic,创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建 Topic。

  • Producer:Producer 发送消息,启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,采用轮询策略从选择一个队列,然后与队列所在的 Broker 建立长连接,并向 Broker 发消息。

  • Consumer:Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。

  • Message Model
    集群消息:一个 Topic 的一条消息,一个消费者组只能有一个消费者实例消费
    广播消息:一个 Topic 的一条消息,一个消费者组所有消费者实例都会消费

RocketMQ部署

在阿里云ECS服务器上部署RocketMQ的过程并不顺利,在多次试图打开NameServer无果并查阅资料后,我发现这似乎是由于内存问题,我的云服务器内存太小了,RocketMQ最低也要在4G内存环境下才能运行。但是在我打开vi修改runbroker.sh 和 runserver.sh修改默认JVM大小后,发现仍然不起作用。最终决定还是在Windows下配置。

让我没想到的是Windows环境下依然报错。一直有关于RocketMQ_HOME或者是Java_HOME的错误提示。在多次试验后,发现只需要将runserver.cmd和runbroker.cmd文件中set "JAVA=%JAVA_HOME%\bin\java.exe"中的%JAVA_HOME%改成本地路径即可,并将上一行‘if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1’删除

启动 nameserver命令

start mqnamesrv.cmd

1 启动 broker命令

start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

1

安装控制台,可以在本地用maven手动打包,也可以用docker,dockerfile已经写好了,我用了最省事的方法,在本地windows的cmd命令窗口,通过cd进入到源码解压目录下的rocketmq-console中,执行maven打包命令并跳过test:

mvn clean package -Dmaven.test.skip=true

在自定义修改application.yml文件的port后,dashboard打开了 1