RocketMQ基本概念及安装(一)

RocketMQ基本概念及安装(一),第1张

RocketMQ基本概念及安装(一) RocketMQ基本概念及安装(一) 一、介绍

RocketMQ是阿里提供的一款提供消息队列服务的中间件,是一套提供了消息生产、存储、消费流程的软件系统。

二、中间件对比 KafkaRocketMQRabbitMQ定位日志消息,监控数据非日志的可靠消息传输非日志的可靠消息传输可用性非常高
分布式、主从非常高
分布式、主从高
主从,采用镜像模式实现,数据量大时可能有性能问题单机吞吐量百万级十万级万级堆积能力非常好非常好一般顺序消费支持
一台broker宕机,消息会乱序支持
顺序消息场景下,消费失败会暂停支持
如果一个消息消费失败,此消息顺序会被打乱定时消息不支持支持支持事务消息不支持支持不支持消息重试不支持支持支持死信队列不支持支持支持访问权限无无可配置账号密码MQTT不支持不支持支持 三、系统架构

1.Name Server

功能介绍·

Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。可理解为ZK,属于RocketMQ集群的注册中心,支持Broker的动态注册与发现及Topic路由。

主要包含功能:

  • Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基础数据。提供心跳检测机制,检查Broker是否还存活。

  • 路由信息管理:每个NameServer中都保存着Broker集群的整个路由信息和用于客户查询端的队列信息。Producer和Consumer可以通过NameServer获取整个Broker集群的路由信息,从而进行消息的投递和消费。

路由注册

NameServer通常也是以集群的方式部署,不过Nameserver是无状态的,即NameServer集群中的各个节点是无差异的,各节点互相不进行信息通讯。在Broker节点启动时,会轮询NameServer列表,与每个NameServer节点建立长连接,发起注册请求。在NameServer内部维护着一个Broker列表用来动态存储Broker信息。

路由剔除
Broker节点为了维护与NameServer间的长连接,会将最新的信息以心跳包的方式上报给NameServer,每30秒发一次心跳。心跳包中包含了BrokerId、BrokerIP、BrokerName等。NameServer接收到心跳包后会更新心跳时间戳,记录Broker最新存活时间。
NameServer中有一个定时任务,每隔10秒扫描一次Broker列表,查看每个Broker的最新心跳时间戳与当前时间是否超过了120秒,如果超过,则判定当前Broker失效,然后将其从Broker列表中剔除。

**路由发现**
RocketMQ的路由发现使用的是Pull模型,当Topic路由信息发生变化时,NameServer不会主动推送给客户端,而是由客户端定时拉去主题最新的路由。默认客户端每30秒拉去一次最新的路由信息。

客户端链接NameServer选择策略
客户端在配置时必须写上NameServer集群的地址,客户端链接NameServer时,客户端会随机一个数将之与NameServer节点数量取模,得到的数就是所需要链接的节点,然后进行链接,如果链接失败,则使用round-robin策略,逐个尝试去链接其他节点。

2.Broker

Broker负责存储消息,转发消息。Broker在RocketMQ系统中负责接收并存储从生产者发送来的消息,同时为消费者拉取或推送请求做准备。Broker同时存储着消息相关的元数据,包括主题、队列、消费者偏移量等。
模块构成

  • Remoting Module : 模块实体,接收client端的请求
  • Client Manager:管理(Producer/Consumer)和维护Consumer的Topic订阅信息
  • Store Service:提供AP I接口处理消息存储到硬盘和查询功能
  • HA Service:高可用服务,提供Master Broker和Slave Broker之间的数据同步
  • Index Service:根据特定的Key对投递到Broker的消息进行索引服务,提供消息查询
3.Producer

消息发布的角色,支持分布式集群的方式部署。Producer通过MQ的负载均衡模块选择响应的Broker集群队列进行消息投递,投递消息支持快速失败并且延迟低。

RocketMQ中的消息生产者以生产者组(Producer Group)的形式出现的。生产者组是同一类生产者的集合,这类Producer集合必须发送相同的Topic类型消息,一个生产者组可以同时发送多个主题消息。

注:这里的负载均衡指的是生产者产生的消息会负载均衡到队列中,并不能保证消息能被平均分配到每个队列中。如图生产者1产生消息10条,生产者2产生消息4条,则队列1队列2各自5条,队列3队列4各自条,此时消息并没有平均分配。

4.Consumer

消息消费的角色,支持分布式集群的方式部署,支持以push推,pull拉的两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,他提供实时消息订阅机制,可以满足大多数用户的需求。

RocketMQ中的消息消费者是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使消息消费方面实现负载均衡和容错的目标变得容易。

注:这里的负载均衡只是指消费者对Broker中的队列进行负载均衡, 不保证消息是平均分配的。

如图中所示有三个消费者,故消费者1消费5条,消费者2消费五条,消费者3消费队列3、4,合计消费4条消息。

在同一消费者组中,1个消费者可以消费多个消息队列,但一个消息队列同一时间只能被一个消费者消费。但是若归属于不同的消费者组,则可共同消费同一队列,如上图。

理论上同一消费组中消费者数量是要小于队列数量的,若大于队列数量,则多余的消费者不会进行消费消息。

四、部署架构

部署特点

  • NameServer是一个无状态节点,可集群部署,节点之间无任何信息同步。

  • Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与slave的对应关系通过指定相同的BrokerName和不同的BrokerIdl来定义。BrokerId为0标识Master,非0标识Slave。每个Broker与NameServer集群中所有的节点建立长连接,定时注册Topic到所有的NameServer。

    注:当前最新版本RocketMQ支持一Master多Slave,但是只有BrokerId为1的从服务器才会参与消息的读负载。

  • Producer随机与NameServer集群中的一个节点建立长链接,定期从NameServer获取Topic的路由信息,并向提供Topic服务的Broker Master建立长连接,定时向Master发送心跳。Producer无状态可集群部署。

  • Consumer随机与NameServer集群中的一个节点建立长连接,定期从NameServer获取Topic的路由信息,并向提供Topic服务的Broker Master,Broker Slave建立长连接,并且定时向Master、Slave发送心跳。Consumer可以从Master、Slave中订阅消息。

部署流程

  1. 启动NameServer,NameServer启动后监听端口,等待Broker、Producer、Consumer链接,相当于注册中心。
  2. Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含了当前Broker的(IP+port等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
  3. 收发消息前,需在控制台创建topic,创建后需指定存储的Broker,也可以在发送消息时自动创建Topic。
  4. Producer发送消息,启动时先跟nameServer集群中的其中一台建立长连接,并从中获取当前发送Topic存在哪些Broker上,轮询从队列的列表中选择一个队列,然后与队列所在的Broker建立长连接发送消息。
  5. Consumer启动时先跟NameServer集群中的一台建立长连接,从中获取当前Topic存在哪些Broker上,跟Broker建立长连接,消费消息。
五、RocketMQ安装 1.安装准备

官网地址:http://rocketmq.apache.org/

去官网下载最新的压缩包:http://rocketmq.apache.org/dowloading/releases/

rocket-console下载:https://github.com/apache/rocketmq-externals

注:rocket-console没有现成的压缩包需下载源码编译后使用

修改配置文件

server.contextPath=/
#访问端口
server.port=8080
### SSL setting  默认就行
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey

#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
#logback配置文件路径,默认即可
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
#Name Server地址,修改成自己的服务地址。多个地址用英文分号“;”隔开
rocketmq.config.namesrvAddr=192.168.2.24:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket

#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false

打包项目

mvn clean package -Dmaven.test.skip=true

至此获得rocketmq-console的启动包。

2.安装流程

1.解压文件

unzip rocketmq-all-4.9.0-release.zip
cd rocketmq-all-4.9.0/

2.启动NameServer

nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

3.启动Broker

nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log 
The broker[%s, 172.30.30.233:10911] boot success...

4.启动rocket-console控制台

java -jar rocketmq-console-ng-1.0.0.jar
## 也可不进行配置文件调整直接在启动时对配置进行重新赋值
java -jar rocketmq-console-ng-1.0.0.jar --server.port=7000 --rocketmq.config.namesrvAddr=192.168.2.24:9876

至此rocketmq服务已安装完成,需要注意的是,若仅学习使用,需将NameServer和Broker的配置进行调整,原服务jdk默认占用4G内存。

修改配置文件

设置jdk使用的内存大小,分别是runserver和runbroker的大小

  • 路径:rocketmq/bin/runserver.sh rocketmq/bin/runbroker.sh

    JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:metaspaceSize=128m -XX:MaxmetaspaceSize=320m"
    
  • 如果是docker启动,也可以在启动时设置覆盖环境变量

    -e "JAVA_OPT=-server -Xms128m -Xmx128m -Xmn128m" 
    

    访问端口7000

    至此RocketMQ安装完成,下面开始进行集群的搭建。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5686364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存