Seata源码笔记(三)
Seata源码笔记(三)
- RPC部分
- 基础接口
- AbstractNettyRemoting
- init方法
- send方法(仅看sendSync)
- sendSync中的钩子
- AbstractNettyRemotingClient
基于incubator-seata-2.x
RPC部分
基础接口
AbstractNettyRemoting
init方法
主要设置请求超时监控,通过 scheduleAtFixedRate 设定定时任务,遍历 futures(futures由send方法放入请求消息信息),将超时请求删除并通知。在 future.remove 后。通过 future.setResultMessage 设置异常信息,来保护多线程下future 的消息同步。
send方法(仅看sendSync)
futures 中记录请求消息,通过 isWritable 判断是否可以写入(因为 writeAndFlush 不是原子操作,是先将消息写入 ChannelOutboundBuffer,再刷新到 socket 的发送缓冲区,所以用 isWritable 方法来判断一下当前 ChannelOutboundBuffer 里的写缓存水位,防止 OOM 发生)。
PS:FrameworkErrorCode被@Deprecated了,但是好像早期代码用的太多了,后来似乎用的ErrorCode,并通过ResourceBundleUtil找的error/ErrorCode获取的异常信息。
sendSync中的钩子
钩子默认用的 StatusRpcHook ,对连接的调用次数进行统计,并通过LeastActiveLoadBalance实现负载均衡里的活跃度自动感知分配算法。
destroyChannel由子类Client和Server负责实现。
AbstractNettyRemotingClient
继承AbstractNettyRemoting,实现RemotingClient,待续。。