SOFA BOLT源码解析之设计要点-通信模型

本文详细解析了SOFA BOLT框架中的四种通信模型:oneway(单向调用)、sync(同步调用)、future(future调用)和callback(回调)。在SOFA BOLT中,BaseRemoting类实现了这些模型,其中invokeSync方法用于同步调用,invokeWithCallback用于回调,invokeWithFuture用于future调用,而oneway则用于单向调用。通信模型的设计考虑了线程阻塞与非阻塞,以及服务端响应的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 设计要点解析

1.1  通信模型

        SOFA Bolt当前支持四种通信模型:

        ●  oneway:单向调用。单向调用不会阻塞请求线程,不关心响应。但是,使用时需要注意控制调用频率和节奏,防止压垮接收方;

        ●  sync:同步调用。同步调用会阻塞请求线程,待响应返回后才能进行下一个请求。这是最常用的一种通信模型;

        ●  future:future调用。Future调用在调用过程中不会阻塞线程,但在获取结果的过程中会阻塞线程;

        ●  callback:回调。回调是真正的异步调用,永远不会阻塞线程,在异步线程里处理响应结果。

        在SOFA Bolt中,实现上述四种通信模型的相关类的类图如下:

        BaseRemoting基于Netty实现了上述四种通信模型,其源码如下:

1. public abstract class BaseRemoting {
2.         ……
3.  
4.     /**
5.      * Synchronous invocation
6.      ……
7.      */
8.     protected RemotingCommand invokeSync(final Connection conn, finalRemotingCommand request, final int timeoutMillis) throwsRemotingException,                                                               InterruptedException {
9.         ……
10.    }
11. 
12.    /**
13.     * Invocation with callback.
14.     ……
15.     */
16.    protected void invokeWithCallback(final Connection conn, finalRemotingCommand request, final InvokeCallback invokeCallback, final inttimeoutMillis) {
17.     ……
18.    }
19. 
20.    /**
21.     * Invocation with futurereturned.
22.     ……
23.     */
24.    protected InvokeFuture invokeWithFuture(final Connection conn, finalRemotingCommand request,  final inttimeoutMillis) {
25.    ……
26. 
27.    };
28. 
29.    /**
30.     * Oneway invocation.
31.     ……
32.     */
33.    protected void oneway(final Connection conn, finalRemotingCommand request) {
34.                ……
35.    };
36.……
37.}

        通过源码可以看出,有两个类在实现上述四种通信模型中发挥了非常重要的作用:

        1. InvokeFuture接口

        一提到Future,大家一定会想到java.util.concurrent.Future。

        Future为我们提供了一个异步编程的方式。Future表现为一个异步计算的结果,可以通过Future查看计算是否完成、等待计算完成、获取计算结果。

        InvokeFuture虽然未实现Future接口,但遵循了Future的设计原理,基于网络通信的特征,为网络通信框架定义了一套同Future接口一样的功能。

1.  public interface InvokeFuture {
2.      /**
3.       * Wait response with timeout.
4.       ……
5.       */
6.      public RemotingCommand waitResponse(final long timeoutMillis) throws InterruptedException;
7.   
8.      /**
9.       * Wait response with unlimit timeout
10.      ……
11.      */
12.     public RemotingCommand waitResponse() throws InterruptedException;
13.  
14.     ……
15.  
16.     /**
17.      * Put the response to the future.
18.      ……
19.      */
20.     public void putResponse(final RemotingCommand response);
21.  
22.      ……
23.  
24.     /**
25.      * Execute the callback.
26.      */
27.     public void executeInvokeCallback();
28.  
29.     /**
30.      * Asynchronous execute the callbackabnormally.
31.      */
32.     public void tryAsyncExecuteInvokeCallbackAbnormally();
33.  
34.      ……
35.  
36.     /**
37.      * Get the application callback of thefuture.
38.      *
39.      * @return
40.      */
41.     public InvokeCallback getInvokeCallback();
42.  
43.     /**
44.      * Add timeout for the future.
45.      *
46.      * @param timeout
47.      */
48.     public void addTimeout(Timeout timeout);
49.  
50.     /**
51.      * Cancel the timeout.
52.      */
53.     public void cancelTimeout();
54.  
55.     /**
56.      * Whether the future is done.
57.      *
58.      * @return
59.      */
60.     public boolean isDone();
61.  
62.      ……
63.  
64.     /**
65.      * set invoke context
66.      * @param invokeContext
67.      */
68.     public void setInvokeContext(InvokeContext invokeContext);
69.  
SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。 为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。 Bolt 名字取自迪士尼动画-闪电狗,是一个基于 Netty 最佳实践的轻量、易用、高性能、易扩展的通信框架。 这些年我们在微服务与消息中间件在网络通信上解决过很多问题,积累了很多经验,并持续的进行着优化和完善,我们希望能把总结出的解决方案沉淀到 SOFABolt 这个基础组件里,让更多的使用网络通信的场景能够统一受益。 目前该产品已经运用在了蚂蚁中间件的微服务 (SOFARPC)、消息中心、分布式事务、分布式开关、以及配置中心等众多产品上。 SOFABolt的基础功能包括: 1、基础通信功能 ( remoting-core ) 基于 Netty 高效的网络 IO 与线程模型运用 连接管理 (无锁建连,定时断链,自动重连) 基础通信模型 ( oneway,sync,future,callback ) 超时控制 批量解包与批量提交处理器 心跳与 IDLE 事件处理 2、协议框架 ( protocol-skeleton ) 命令与命令处理器 编解码处理器 心跳触发器 3、私有协议定制实现 - RPC 通信协议 ( protocol-implementation ) RPC 通信协议的设计 灵活的反序列化时机控制 请求处理超时 FailFast 机制 用户请求处理器 ( UserProcessor ) 双工通信
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任性之闲来无事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值