路由注册之处理请求包|学习笔记

简介: 快速学习路由注册之处理请求包

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)路由注册之处理请求包】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12466


路由注册之处理请求包

 

处理心跳包

在broker发送请求之后,NameServer如何处理:

在NameServer项目中有一个processor包,processor里有个DefaultRequestProcessor类,在这类当中,负责处理它所接受到的请求,结合下图来看:

image.png

processRequest负责接受心跳注册请求,之后是对请求类型进行判断,因为NameServer不仅仅接受broker的心跳请求,还会接受producer和consumer的请求。

switch (request.getcode()) {

case Requestcode.PuT_kv_cONFIG:

return this.putkvconfig(ctx,request);

case Requestcode.GET_KV_CONFIG:

return this.getKvconfig(ctx,request);

case Requestcode.DELETE_Kv_CONFIG:

return this.deletekvconfig(ctx,request);

case Requestcode.QUERY_DATA_VERSION:

return queryBrokerTopicconfig(ctx,request);

case Requestcode.REGISTER_BROKER:

Version brokerVersion = MQversion.value2version(reque

st.getVersion());

if (brokerVersion.ordinal() >= MQversion.version.v3_0_11.

ordinal()) {

return this.registerBrokerwithFilterserver(ctx,request);

}else {

return this.registerBroker( ctx,request);

case Requestcode. UNREGISTER_BROKER:

return this.unregisterBroker( ctx, request);

在registerBroker中最核心的路由注册由RouteInfoManger完成

//获得响应

final Remotingcommand response = Remotingcommand.createResponsecommand(RegisterBrokerResponseHeader.class);

//创建响应头

final RegisterBrokerResponseHeader responseHeader = (RegisterBrokerResponseHeader)response .readcustomHeader();

final RegisterBrokerRequestHeader= (RegisterBrokerRequestHeader)request.decodecommandCustomHeader(RegisterBrokerRequestHeader.class) ;

以上准备工作完成后,通过RouteinfoManager进行注册:

RegisterBrokerResult result = this.namesrvcontroller.getRou

teinfoManager( ).registerBroker(

requestHeader.getclusterName(),

requestHeader.getBrokerAddr(),

requestHeader.getBrokerName( ),

requestHeader-getBrokerId(),

requestHeader.getHaServerAddr( ),

topicconfigwrapper,

filterServerList: null,

ctx.channel()

);

在注册时,注意this. lock.writeLock( ). lockInterruptibly()代码,这行代码说明路由注册是同步,串行化的过程,故在上图中有“加锁”标识。下面对clusterAddrTable和brokerAddrTable进行维护,然后在往下运行,对brokerLiveTable进行了维护。

在DefaultRequestProcesso代码中,如果当前brokerVersion版本大于3.0.11,运行的是registerBrokerwithFilterServer方法。

if (brokerVersion.ordinal() >= MQversion.version.v3_e_11.ord

inal()) {

return this.registerBrokerwithFilterServer(ctx,request);

如果,filterserverList不为空,会进行维护处理。

if (filterserverList !=-nul1) {

if (filterserverList.isEmpty() {

this.fi1terserverTable.remove(brokerAddr);

}else {

this.filterserverTable.put(brokerAddr,filterserverList);

}

}

总结:在NameServer处理心跳包时主要用到DefaultRequestProcesso和RouteInfoManger两个类,真正工作的是RouteInfoManger,在维护路由表时是同步状态。

相关文章
|
负载均衡 Java Apache
【微服务系列笔记】Feign
Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解。
384 8
|
存储 缓存 关系型数据库
Mysql专栏 - Linux底层交互和Raid存储架构
Mysql专栏 - Linux底层交互和Raid存储架构
274 0
|
存储 运维 Cloud Native
混合云的多活架构指南
在之前的《如何正确选择多云架构?》一文中介绍了混合云(广义的多云)的诸多架构以及各自的优势,本篇会重点来介绍下混合云下的多活架构。
833 0
混合云的多活架构指南
|
3天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
5天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1091 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1760 9
|
10天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
697 152