面向面试编程:RocketMQ——NameServer

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

面试官:RocketMQ的NameServer原理有了解过吗?

NameServer是RocketMQ的起点。

集群化部署

要部署RocketMQ,就得先部署NameServer。

NameServer是支持部署多台机器的,也就是集群化部署。他是集群里非常关键的一个角色,他要管理broker,别人都要通过他才知道要跟哪个broker通信。

如果NameServer只部署一台机器,一旦宕机,整个集群都会出现故障。通常来说,NameServer一定要部署多台机器实现一个集群,保证高可用性。

注册broker信息

面试官:broker是把自己的信息注册到哪个NameServer上面去?

每个broker启动都得向所有的NameServer进行注册,保证每个NameServer都有一份集群中所有broker的信息。

获取broker信息

面试官:系统如何从NameServer获取broker信息?

RocketMQ中的生产者和消费者,自己主动去NameServer拉取broker路由信息。

通过这些路由信息,每个系统就知道发送消息或者获取消息去哪个broker上去进行了。

面试官:如果broker挂了,NameServer是如何感知的?

现在一个broker启动之后向NameServer注册了,每个NameServer都知道集群中有这个broker了,然后各个系统从NameServer中拉取路由信息也知道有这个broker的存在了。

那此时broker挂了怎么办呢?

broker跟NameServer之间存在一种心跳机制,broker会每隔30秒给所有的NameServer发送心跳,告诉他们自己还活着。

每次NameServer收到一个broker的心跳,就会更新一下他最近一次心跳的时间。

然后NameServer会每隔10秒运行一个任务,去检查一下各个broker的最近一次心跳的时间,如果某个broker超过120秒没发送心跳了,那么就任务这个broker挂了。

面试官:broker挂了,系统如何感知?

作为生产者和消费者系统,怎么感知到broker挂了,此时某个系统发送消息到那个已经挂了的broker是绝对不可能成功的。

有两种解决方案,首先可以考虑不发送消息到那台broker,改成发送到其他broker上去,其次假设必须要发送消息到那台挂了的broker,可以考虑跟他的Slave进行通信。

对于生产者而言,他自己是有一套容错机制的。