@x-power
2019-09-18T18:13:10.000000Z
字数 1520
阅读 2089
消息队列
部署环境
Rocket
物理部署结构
Name Server
: 单点,供Producer
和Consumer
获取Broker
地址, 类似于注册中心.
Producer
: 产生并发送消息.
Consumer
: 接收并消费消息.
Broker
: 消息暂存,消息转发.
Name Server
做的是Rocket
的寻址服务, 用于将Broker
的路由信息做聚合. 客户端依靠Name Server
决定去获取对应topic
的路由信息,从而决定对那些Broker
做链接.
Name Server
是一个几乎无状态的节点,Name Server
之间采用Share-Nothing
的设计, 互不通信.对于一个
Name Server
集群列表, 客户端链接Name Server
的时候会随机选择一个节点, 以做到负载均衡.
Name Server
所有状态都从Broker
上报上来, 本身不存储任何状态, 所有数据均在内存.如果中途所有的Name Server都挂了, 只会影响到路由信息的更新, 并不会影响到和
Broker
的通信.(Eureka 的本地缓存服务注册信息 )
Broker
是做消息存储,转发的服务器.
Broker
以group
分开,每个group
只允许一个master
,若干个slave
.
一个master
可以有多个slave
,但是一个slave
只能有一个master
.
只有master
才可以进行写入操作,slave
不允许.
slave
从master
中同步数据. 同步策略取决于master
的配置, 可以采用同步双写,异步复制两种.
客户端消费可以从master
和slave
中消费. 在默认的情况下,消费者都从master
消费, 在master
挂掉之后, 客户端由于从Name Server
中感知到Broker
挂机,就会从slave
消费. (尽量从master
消费, 这样消息会比较及时, 不用牵扯到消息复制的延迟问题.)
RocketMQ
的部署结构有一下特点:
Name Server
是一个无状态节点, 可以集群部署, 节点之间没有信息同步.Broker
部署分为Master
和Slave
. 一个master
对应多个slave
,但是一个slave
只可以有一个master
, 他们之间的对应关系通过制定相同的BrokerName
, 不同的BrokerId
来定义, BrokerId
为0表示master
,非0表示Slave
, Master
也可以部署多个. 每个Broker
与Name Server
集群中的所有节点建立长连接, 定时注册Topic
信息到所有Name Server
.Producer
与Name Server
集群中的其中一个节点(随机选择)建立长连接,定期从Name Server
获取Topic
信息,并且向提供服务的Topic
服务的Master
建立长连接, 并且定时向Master
发送心跳. Consumer
和Name Server
集群中的其中一个节点(随机选择)建立长连接, 定期从Name Server
取Topic
路由信息, 并且向提供Topic
服务的Master
建立长连接, 且定时发送心跳. Consumer
既可以从Master
订阅消息,也可以从Slave
订阅消息. 规则由Broker
决定.用来表示一个发送消息的应用, 一个
Producer Group
下包含多个Producer
实例,可以使多个机器,也可以是一台机器的多个进程, 或者一个进程的多个Producer
对象. 一个Producer Group
可以发送多个Topic
消息,Producer Group
的作用如下: