RoctetMq的架构

回到最开始的问题,RocketMq的原理是什么,也就是怎么实现的,先看图
在这里插入图片描述

RocketMq一共有四个部分组成:NameServer,Broker,Producer生产者,Consumer消费者,每一 部分都是集群部署的。
NameServer
NameServer是一个无状态的服务器,角色类似于Dubbo的Zookeeper,但比Zookeeper更轻量。 特点:
每个NameServer结点之间是相互独立,彼此没有任何信息交互。
Nameserver被设计成几乎是无状态的,通过部署多个结点来标识自己是一个伪集群,Producer在发送消息前从NameServer中获取Topic的路由信息也就是发往哪个Broker,Consumer也会定时从NameServer获取topic的路由信息,Broker在启动时会向NameServer注册,并定时进行心跳连 接,且定时同步维护的Topic到NameServer。
功能主要有两个:
1、跟Broker结点保持长连接。
2、维护Topic的路由信息。
Broker
消息存储和中转角色,负责存储和转发消息。
Broker内部维护着一个个Message Queue,用来存储消息的索引,真正存储消息的地方是CommitLog(日志文件)。
单个Broker与所有的Nameserver保持着长连接和心跳,并会定时将Topic信息同步到
NameServer,和NameServer的通信底层是通过Netty实现的。

Producer
消息生产者,业务端负责发送消息,由用户自行实现和分布式部署。
Producer的负载均衡
Producer的负载均衡是由MQFaultStratege.selectOneMessageQueue()来实现的。这个方法就是随机 选择一个要发送消息的broker来达到负载均衡的效果,选择的标准:尽量不选刚刚选过的broker,尽量 不选发送上条消息延迟过高或没有响应的broker,也就是找到一个可用的broker。(源码不贴了)
发送的三种策略
Producer发送消息有三种方式:同步、异步和单向
同步:同步发送是指发送方发出数据后等待接收方发回响应后在发送下一个数据包。一般用于重要 的消息通知,如重要的通知邮件或者营销短信等。
异步:异步发送是指发送方发出数据后不等接收方发回响应就发出下一个数据包。一般用于可能链 路耗时较长而对响应时间比较敏感的场景。如视频上传后通知启动转码服务。
单向:单向发送是指只负责发送消息而不等待接收方发送响应且没有回调函数,适合那些耗时比较 短且对可靠性要求不高的场景,例如日志收集。
Consumer
消息消费者,负责消费消息,由用户自行实现并进行集群部署。
推拉消费模式
PULL:拉取型消费者主动从broker中拉取消息消费,只要拉取到消息,就会启动消费过程,称为 主 动 型 消 费 。 PUSH:推送型消费者就是要注册消息的监听器,监听器是要用户自行实现的。当消息达到broker 服务器后,会触发监听器拉取消息,然后启动消费过程。但是从实际上看还是从broker中拉取消 息,称为被动消费型。
集群还是广播
看业务需求,默认是集群消费。
集群消费:broker中的一条消息会发送给订阅这个topic的一个消费组里的唯一一个消费者进行消 费。如果这个消费者挂掉了,组里的其他消费者会接替它进行消费。
广播消费:broker中的一条消息会发送给订阅这个topic的一个消费组里的每一个消费者进行消 费。
Consumer的负载均衡
Consumer的负载均衡是指将MessageQueue中的消息队列分配到消费者组里的具体消费者。Consumer在启动的时候会实例化rebalanceImpl,这个类负责消费端的负载均衡。通过rebalanceImpl调用allocateMesasgeQueueStratage.allocate()完成负载均衡。
每次有新的消费者加入到组中就会重新做一下分配。每10秒自动做一次负载均衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值