基本概念
基本概念:
- 生产者:发送数据到消息队列的客户端
- 消费者:消费消息队列数据的客户端
- 消息队列:提供消息队列服务,负责接收生产者发送的数据,异步向消费者发送需要消费的数据,像一个队列一样。
对消息队列的理解:
一个数据运输系统,从数据发送方接收数据,向数据接收方发送数据,有一定的数据暂时存储能力。像一个蓄水池,生产者为入水口,消费者为出水口。
消息队列的作用:
- 进程间的通信:实现生产者到消费者的单向通信。
- 数据分发:不同的topic实现一对多数据分发
- 异步任务处理:生产者可发送消息到消息队列后直接返回,剩下的事消费者异步处理。
- 削峰填谷:消息队列有一定的数据存储能力,瞬时突增的任务对于消费者可以后面慢慢处理
- 解耦:新增处理需求时,无需修改生产者的代码,只需要新增一个消费者,像可插拔的组件一样
NameServer
作用:存储集群的broker、topic等信息,为client提供服务发现
NameServer 存储的信息:
-
topicQueueTable:存储 topic 的路由列表信息,包括 brokername、读写队列数、读写权限、topic同步标记
-
brokerAddrTable:存储 broker 信息,包括 brokername、集群名字、主备 broker 地址
-
clusterAddrTable:存储集群信息,包含的所有broker
-
brokerLiveTable:存储 broker 活跃状态,上一次心跳的时间
-
filterServerTable:Broker 上的 FilterServer 列表,用于类模式消息过滤
路由注册、更新过程:
-
Broker 每30s向所有 NameServer 发送心跳
- header包含:broker地址、brokerId、brokerName、clusterName、master地址
- body包含:filterServerList 消息过滤服务器列表、topicConfigWrapper 主题配置
-
NameServer 处理心跳消息,加锁后进行如下处理:
-
查找 clusterAddrTable 判断 cluster 是否存在,不存在就创建并添加此 broker
-
查找 brokerAddrTable 判断 broker 是否存在,
- 不存在就创建并添加,registerFirst 标记为 true
- 存在就更新信息,registerFirst 标记为 false
-
更新topic信息:当broker为master,初次注册或topic信息更新时,更新 topicQueueTable
-
更新 brokerLiveTable 对应的心跳时间
-
更新 filterServerTable ,broker 为从节点时额外更新对应的 masterAddr
-
路由删除过程:
-
NameServer 每10s检查 brokerLiveTable 中各broker的存活状态,当超过120s未更新心跳,说明broker出现故障,加锁后进行如下删除操作:
- 根据 brokerAddress 将broker从brokerLiveTable、filterServerTable移除
- 遍历 brokerAddrTable 根据 brokerAddress 删除对应 BrokerData 中的addr信息,当 addr 为空,移除整个BrokerData
- 根据brokerName,删除clusterAddrTable中的信息,当删除后为空,删除整个cluster
- 根据brokerName,遍历topicQueueTable,删除对应brokerName,当删除后brokerName为空,则删除整个topic
-
其次,broker正常关闭时,也会删除对应路由信息
路由发现过程:
-
客户端定时主动请求NameServer拉取最新路由信息:
-
orderTopicConf:顺序消息配置内容
-
queueData:topic队列元数据
-
brokerDatas:topic分布的broker元数据
-
filterServerTable:broker上过滤服务器地址列表
-
NameServer 如何实现高可用?
NameServer 由多台机器组成,每台机器权力对等,都可以提供路由注册与发现的服务,机器间不会进行数据交流。只要有存活的 NameServer 就可以提供服务。