SOFABolt是一款功能强大的网络通信框架软件。SOFABolt最新版是蚂蚁金融服务集团所开发的,在netty的基础上进行开发。目前该软件已经适用在蚂蚁中间的微服务、消息中心、分布式开关以及别的产品上。
SOFABolt功能介绍
SOFABolt的基础功能包括:
1、基础通信功能 ( remoting-core )
基于 Netty 高效的网络 IO 与线程模型运用
连接管理 (无锁建连,定时断链,自动重连)
基础通信模型 ( oneway,sync,future,callback )
超时控制
批量解包与批量提交处理器
心跳与 IDLE 事件处理
2、协议框架 ( pro tocol-skeleton )
命令与命令处理器
编解码处理器
心跳触发器
3、私有协议定制实现 - RPC 通信协议 ( prot ocol-implementation )
RPC 通信协议的设计
灵活的反序列化时机控制
请求处理超时 FailFast 机制
用户请求处理器 ( UserProcessor )
双工通信
SOFABolt使用方法
将 SOFABolt 用作一个远程通信框架,使用者可以不用关心如何实现一个私有协议的细节,直接使用我们内置的 RPC 通信协议。可以非常简单的启动客户端与服务端,同时注册一个用户请求处理器,即可完成远程调用。同时,像连接管理、心跳等基础功能特性都默认可以使用。 当前支持的调用类型如下图所示:
将 SOFABolt 用作一个协议框架,使用者可以复用基础的通信模型、协议包含的接口定义等基础功能。然后根据自己设计的私有协议自定义 Command 类型、Command 处理器、编解码处理器等。如下图所示,RPC 和消息的 Command 定义结构:
SOFABolt高级功能
1. 开启IO线程处理机制
默认情况下,我们使用最佳实践的线程模型来处理请求,即尽可能少的占用 IO 线程,但有一些场景,比如计算过程非常简单,希望减少线程切换,尽可能大的增加IO 吞吐量的场景。此时我们提供了一个开关,来让业务处理也在 IO 线程执行。
2. 启用用户处理器多线程池机制
请求处理过程,默认是一个线程池,那么当这个线程池出现问题后,则会造成整体的吞吐量降低。而有些业务场景,希望对他们核心的请求处理过程,单独分配一个线程池。避免不同请求互相影响。此时我们提供了一个线程池选择器:
实现一个线程池选择器;
然后设置到用户请求处理器里面,调用过程即可根据选择器的逻辑来选择对应的线程池。
3. 请求处理超时 FailFast 机制
当服务端接收到请求后,如果线程池队列的排队等待时间已经超过了客户端发起调用时设置的超时时间,那么本次调用可以直接丢弃,因为请求,对于客户端来说已经无用了(注意:oneway调用方式该机制不起作用,因为不用设置超时时间)。默认情况下,我们这个功能都是开启的;考虑到有用户可能会需要自己来做是否丢弃请求的判断,同时打印一些日志来自己做记录,我们提供了一个开关来控制这个功能:
开关控制
1. @Override
2. public boolean timeoutDiscard() {
3. return false;// true表示开启自动丢弃,false表示关闭自动丢弃,用户在之后的处理processor里,可自行决策
4. }
判断超时与打印日志
1. public class SimpleClientUserProcessor extendsSyncUserProcessor<RequestBody> {
2. @Override
3. public Object handleRequest(BizContextbizCtx, RequestBody request) throws Exception {
4. if(bizCtx.isRequestTimeout()){
5. log.info("arrive time:{}", bizCtx.getArriveTimestamp());
6. ...
7. }
8. }
9. }
4. 定制协议
对于通信类型比较简单的场景,我们直接复用 RPC 通信协议,使用对应的通信类型,就能解决大部分问题。而有一些场景,比如消息中间件,数据库中间件等,有自己私有的通信协议,以及大量的请求命令类型,此时就需要从头来定制协议。此时将 SOFABolt 用作一个协议框架和具备基础通信功能的组件,比如基础通信模型、连接管理等功能是可以复用的;而协议相关的部分需要自己来开发和实现,可以参考 RPC 协议实现的内容。