电报群组导航(www.telegram8.vip)是一个Telegram群组分享平台,电报群组导航内容包括Telegram群组导航、telegram群组、Telegram群组导航、新加坡telegram群组、telegram中文群组、telegram群组(其他)、Telegram 美国 群组、telegram群组爬虫、电报群 科学上网、小飞机 怎么 加 群、tg群等内容,为广大电报用户提供各种电报群组/电报频道/电报机器人导航服务。

首页快讯正文

收购usdt(www.caibao.it):Seata RPC 模块的重构之路

admin2022-05-15253

USDT自动充值接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

原题目:Seata RPC 模块的重构之路

简介: RPC 模块是我最初研究 Seata 源码最先的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要举行优化,使得代码加倍优雅,交互逻辑加倍清晰易懂,本着 “让天下没有难明的 RPC 通讯代码” 的初衷,我最先了 RPC 模块的重构之路。

RPC 模块是我最初研究 Seata 源码最先的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要举行优化,使得代码加倍优雅,交互逻辑加倍清晰易懂,本着 “让天下没有难明的 RPC 通讯代码” 的初衷,我最先了 RPC 模块的重构之路。

这里建议想要深入领会 Seata 交互细节的,不妨从 RPC 模块的源码入手,RPC 模块相当于 Seata 的中枢,Seata 所有的交互逻辑在 RPC 模块中显示得淋漓尽致。

这次 RPC 模块的重构将会使得 Seata 的中枢变得加倍结实和易于解读。

在 Seata 的旧版本中,RPC 模块的整体结构有点杂乱,尤其是在各个类的继续关系上,主要体现在:

  1. 客户端和服务端的 Reomting 类继续关系不统一。
  2. RemotingClient 被 RpcClientBootstrap 实现,而 RemotingServer 却被 RpcServer 实现,没有一个自力的 ServerBootstrap,这个看起来关系异常杂乱。
  3. 有些接口没必要抽取出来,好比 ClientMessageSender、ClientMessageListener、ServerMessageSender 等接口,因这些接口会增添整体结构继续关系的复杂性。

针对上面发现的问题,在重构过程中我大致做了如下事情:

  1. 将 Netty Handler 抽象成一个内部类放在 Remoting 类中。
  2. 将 RemotingClient 为客户端顶级接口,界说客户端与服务端交互的基本方式,抽象一层 AbstractNettyRemotingClient,下面划分有 RmNettyRemotingClient、TmNettyRemotingClient;将 RemotingServer 为服务端顶级接口,界说服务端与客户端交互的基本方式,实现类 NettyRemotingServer。
  3. 同时将 ClientMessageSender、ClientMessageListener、ServerMessageSender 等接口方式归入到 RemotingClient、RemotingServer 中,由 Reomting 类实现 RemotingClient、RemotingServer,统一 Remoting 类继续关系。
  4. 新建 RemotingBootstrap 接口,客户端和服务端划分实现 NettyClientBootstrap、NettyServerBootstrap,将指导类逻辑从 Reomting 类抽离出来。

在最新的 RPC 模块中的继续关系简朴清晰,用如下类关系图示意:

  1. AbstractNettyRemoting:Remoting 类的最顶层抽象,包罗了客户端和服务端公用的成员变量与公用方式,拥有通用的请求方式(文章后面会讲到),Processor 处置器挪用逻辑(文章后面会讲到)。
  2. RemotingClient:客户端最顶级接口,界说客户端与服务端交互的基本方式。
  3. RemotingServer:服务端最顶级接口,界说服务端与客户端交互的基本方式。
  4. AbstractNettyRemotingClient:客户端抽象类,继续 AbstractNettyRemoting 类并实现了 RemotingClient 接口。
  5. NettyRemotingServer:服务端实现类,继续 AbstractNettyRemoting 类并实现了 RemotingServer 接口。
  6. RmNettyRemotingClient:Rm 客户端实现类,继续 AbstractNettyRemotingClient 类。
  7. TmNettyRemotingClient:Tm 客户端实现类,继续 AbstractNettyRemotingClient 类。

同时将客户端和服务端的指导类逻辑抽象出来,如下类关系图示意:

  1. RemotingBootstrap:指导类接口,有 start 和 stop 两个抽象方式。
  2. NettyClientBootstrap:客户端指导实现类。
  3. NettyServerBootstrap:服务端指导实现类。

解耦处置逻辑

解耦处置逻辑即是将 RPC 交互的处置逻辑从 Netty Handler 中抽离出来,并将处置逻辑抽象成一个个 Processor,为什么要这么做呢?我大致讲下现在存在的一些问题:

  1. Netty Handler 与 处置逻辑是糅合在一起的,由于客户端与服务端都共用了一套处置逻辑,因此为了兼容更多的交互,在处置逻辑中你可以看到异常多难以明了的判断逻辑。
  2. 在 Seata 的交互中有些请求是异步处置的,也有一些请求是同步处置的,但是在旧的处置代码逻辑中对同步异步处置的表达异常隐晦,而且难以看明了。
  3. 无法从代码逻辑当中清晰地表达出请求新闻类型与对应的处置逻辑关系。
  4. 在 Seata 后面的更新迭代中,若是不将处置处置逻辑抽离出来,这部门代码想要增添新的交互逻辑,将会异常难题。

在将处置逻辑从 Netty Handler 举行抽离之前,我们先梳理一下 Seata 现有的交互逻辑。

  • TM 客户端请求服务端的交互逻辑:

  • 服务端请求 RM 客户端的交互逻辑:

从以上的交互图中可以清晰地看到了 Seata 的交互逻辑。

客户端总共吸收服务端的新闻:

1)服务端请求新闻

  • BranchCommitRequest、BranchRollbackRequest、UndoLogDeleteRequest

2)服务端响应新闻

  • RegisterRMResponse、BranchRegisterResponse、BranchReportResponse、GlobalLockQueryResponse
  • RegisterTMResponse、GlobalBeginResponse、GlobalCommitResponse、GlobalRollbackResponse、GlobalStatusResponse、GlobalReportResponse
  • HeartbeatMessage(PONG)

服务端总共吸收客户端的新闻:

,

Usdt第三方支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

1)客户端请求新闻

  • RegisterRMRequest、BranchRegisterRequest、BranchReportRequest、GlobalLockQueryRequest
  • RegisterTMRequest、GlobalBeginRequest、GlobalCommitRequest、GlobalRollbackRequest、GlobalStatusRequest、GlobalReportRequest
  • HeartbeatMessage(PING)

2)客户端响应新闻

  • BranchCommitResponse、BranchRollbackResponse

基于以上的交互逻辑剖析,我们可以将处置新闻的逻辑抽象成若干个 Processor,一个 Processor 可以处置一个或者多个新闻类型的新闻,只需在 Seata 启动时注册将新闻类型注册到 ProcessorTable 中即可,形成一个映射关系,这样就可以凭据新闻类型挪用对应的 Processor 对新闻举行处置,用如下图示意:

在抽象 Remoting 类中定一个 processMessage 方式,方式逻辑是凭据新闻类型从 ProcessorTable 中拿到新闻类型对应的 Processor。

这样就乐成将处置逻辑从 Netty Handler 中彻底抽离出来了,Handler#channelRead 方式只需要挪用 processMessage 方式即可,且还可以天真凭据新闻类型动态注册 Processor 到 ProcessorTable 中,处置逻辑的可扩展性得到了极大的提升。

以下是 Processor 的挪用流程:

1)客户端

  • RmBranchCommitProcessor:处置服务端全局提交请求。
  • RmBranchRollbackProcessor:处置服务端全局回滚请求。
  • RmUndoLogProcessor:处置服务端 undo log 删除请求。
  • ClientOnResponseProcessor:客户端处置服务端响应请求,如:BranchRegisterResponse、GlobalBeginResponse、GlobalCommitResponse 等。
  • ClientHeartbeatProcessor:处置服务端心跳响应。

2)服务端

  • RegRmProcessor:处置 RM 客户端注册请求。
  • RegTmProcessor:处置 TM 客户端注册请求。
  • ServerOnRequestProcessor:处置客户端相关请求,如:BranchRegisterRequest、GlobalBeginRequest、GlobalLockQueryRequest 等。
  • ServerOnResponseProcessor:处置客户端相关响应,如:BranchCommitResponse、BranchRollbackResponse 等。
  • ServerHeartbeatProcessor:处置客户端心跳响应。

下面我以 TM 提议全局事务提交请求为例子,让人人感受下 Processor 在整个交互中所处的位置:

重构请求方式

在 Seata 的旧版本当中,RPC 的请求方式也是欠缺优雅,主要体现在:

  1. 请求方式过于杂乱无章,没有层次感。
  2. sendAsyncRequest 方式耦合的代码太多,逻辑过于杂乱,客户端与服务端都共用了一套请求逻辑,方式中决议是否批量发送是凭据参数 address 是否为 null 决议,决议是否同步请求是凭据 timeout 是否大于 0 决议,显得极为不合理,且批量请求只有客户端有用到,服务端并没有批量请求,共用一套请求逻辑还会导致服务端异步请求也会建立 MessageFuture 放入 futures 中。
  3. 请求方式名称气概不统一,好比客户端 sendMsgWithResponse,服务端却叫 sendSyncRequest;

针对以上旧版本 RPC 请求方式的种种瑕玷,我作了以下改动:

  1. 将请求方式统一放入 RemotingClient、RemotingServer 接口当中,并作为顶级接口;
  2. 星散客户端与服务端请求逻辑,将批量请求逻辑单独抽到客户端相关请求方式中,使得是否批量发送不再凭据参数 address 是否为 null 决议;
  3. 由于 Seata 自身的逻辑特点,客户端服务端请求方式的参数无法统一,可通过抽取通用的同步/异步请求方式,客户端和服务端凭据自身请求逻辑特点实现自身的同步/异步请求逻辑,最后再挪用通用的同步/异步请求方式,使得同步/异步请求都有明确的方式,不再凭据 timeout 是否大于 0 决议;
  4. 统一请求名称气概。

最终,Seata RPC 的请求方式终于看起来加倍优雅且有层次感了。

同步请求:

异步请求:

其它

  1. 类目录调整:RPC 模块目录中另有一个 netty 目录,也可以从目录结构中发现 Seata 的初衷是兼容多个 RPC 框架,现在只实现了 netty,但发现 netty 模块中有些类并不 ”netty“,且 RPC 跟目录的类也并不通用,因此需要将相关类的位置举行调整。
  2. 某些类重新命名,好比 netty 相关类包罗 「netty」。

最终 RPC 模块看起来是这样的:

作者:张乘辉

网友评论

11条评论
  • 2021-02-20 00:18:29

    allbetgame.uswww.allbetgame.us欢迎进入欧博平台网站(www.allbetgaming.net),www.allbetgaming.net开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。作者辛苦了。

    • 2021-02-20 04:43:53

      @下载欧博真人客户端 《逐日经济新闻》获悉,距2020年12月22日完成5.15亿美元E轮融资不到一个月,货拉拉于今日薄暮完成了高达15亿美元F轮融资的前两笔交割,本轮融资由高瓴资源独家领投。尚有一笔两亿美元的第三笔交割尚在进行中。特点挺多的

    • 2021-08-02 11:00:09

      @下载欧博真人客户端 相较苹果首波仅有 2,000 万首无损音质音乐、年底才预计达 7,000 万首无损音质音乐,当前 Amazon Music HD 提供达 7,500 万首无损音质与 700 万首高音质音乐,且亦与 Sony 、 Dolby 互助,提供 Sony 360 Reality Audio ( 360RA )与 Dolby Atmos 等空间音讯,此外也不受限 Android 与 iOS 系统的播放能力。然而事实品牌招呼力与当前仅限特定国家提供服务,自然使 Amazon Music 服务的广度受到影响。喜欢晚上看

  • 2021-11-20 00:04:51

    U交所(www.payusdt.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。这剧情我爱

    • 2021-12-27 03:51:30

      @皇冠下载(www.22223388.com) 为确保集中攻坚执法成效,检查组将突出问题交办闭环,对检查发现的问题,由县应急治理局下达《关于执法处置平安生产问题的交办函》,交由属地镇街应急治理办下达执法文书并跟踪督促整改情形。检查发现的违法行为到达立案处置尺度的予以立案处罚,检查发现重大生产平安事故隐患的,根据“一单四制”事情制度挂牌督办。十分给力啊,好站

  • 2021-12-04 00:10:09

    Google也指出上述更新预计会在下半年最先陆续推出,包罗与 Samsung 相助打造的整合性平台、全新的使用者体验,以及 Fitbit 带来的天下级健身服务,让Android穿着式装置生态圈迈入全新时代。这个,很值

  • 2022-01-19 00:01:41

    韩国人[气组合Super Junior成员李东海与银赫(李赫宰)将出击{综艺}《帮我找屋子吧》。

    18日,据韩媒采访,李东海与银赫(李赫宰)将以实习助理的身份出击MBC{综艺}《帮我找屋子吧》。最近以完成录制,播出日期尚未确定。16日以正规10辑《The Renaissance》回归的Super Junior,‘在’回归之前就出演了多个{综艺}。其中东海和银赫确定出击《帮我找屋子吧》,将展现值得信托的{综艺}感和充满活力的面目,吸引观众的眼球。“正以主打曲”《house party》流动的Super Junior出演为委派人寻找“家”的{综艺}节目,“也是”一个有时的巧合。东海和银赫在节目中是否能为委派人找到知足‘条件的屋子’,备受关注。

    另外,《帮我找屋子吧》每周日晚10点45分(韩国时间)<通过>MBC播出。我转手就是一个赞

最新评论