欢迎进Allbet欧博官网,Allbet欧博官网是欧博集团的官方网站。Allbet欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

首页快讯正文

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

admin2021-02-2082

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 模块看起来是这样的:

作者:张乘辉

网友评论

3条评论
  • 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轮融资的前两笔交割,本轮融资由高瓴资源独家领投。尚有一笔两亿美元的第三笔交割尚在进行中。特点挺多的

最新评论