国产巨轮——蚂蚁金服SOFA-RPC框架深度分析

详解蚂蚁开源框架SOFA 前言 SOFA解决:分布式下的服务和组件管理以及调用繁琐的问题 SOFA结构图 1.Sofa是什么 SOFA 源自于 Service Oriented Fabric Architecture,即面向服务的架构。 随着 SOFA 的开源,目前 SOFA 的新解释:Scalable Open Financial Architecture SOFA 是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,. 阅读详情

蚂蚁金服近期开源了研发多年的SOFA一篮子框架,其中就有一个非常核心的RPC框架,它叫SOFA-BOLT。小编今天花了近一天的时间仔细阅读研究它的源码,阅读过程中遇到了不少问题,蚂蚁金服的相关技术人员都非常耐心的及时解答了我的疑难。这里将我从中学到的知识点一并分享给大家。

SOFA-BOLT基于开源的Netty框架,同时提供了服务器和客户端的实现。它的源码非常值得一读,结构简单,考虑周全,绝不是一个普通的玩具。它没有滥用设计模式,源码阅读起来比较直接,没有太多绕来绕去的复杂结构。

640?wx_fmt=png

一个节点既可以同时既是RPC服务器又是客户端,作为客户端该节点需要其它节点提供服务,作为服务器它可以为其它节点提供服务。不过上面这张图并不是合理的结构,因为两个服务相互耦合了,我需要你,你也需要我,就成了鸡蛋问题。比较合理的结构一般如下图所示,它们之间不构成环。

640?wx_fmt=png

通讯协议

通讯协议是客户端和服务器之间交流的语言,SOFA定义了自己的一套通讯协议,它的编码解码分为二层,第一层是消息体对象的二进制序列化,这部分默认由开源的Hession协议库序列化完成,第二层是负责给序列化的消息体增加一系列包装字段,形成一个完整的消息。包括请求ID、消息体的长度、协议版本号和CRC32校验位等等

如果希望进一步优化网络性能,SOFA还提供了Snappy压缩协议,可以在现有的两层协议基础上增加第三层,能显著降低网络传输负担。压缩是时间换空间,提升网络性能的同时,它也会加重CPU计算,所以在使用时需要适当进行权衡。

640?wx_fmt=png

连接池

客户端和服务器之间一般需要建立多个连接,但是也不能每个请求都建立一个连接。一般是通过维护一个连接池,限定最大连接数。客户端通过有限的连接来和服务器进行通信。

我们在使用Jedis客户端和Redis服务器进行通信时,也是通过连接池来获取连接的。Jedis的连接必须是线程独占的,因为它不是线程安全的。从连接池中获取连接时,其它线程就暂时拿不到这个连接了,待当前线程处理完毕后,要将连接归还给线程池,这样其它线程才可以继续使用这个连接。

640?wx_fmt=png

Redis的客户端请求和应答是顺序性的,一问一答,所以请求和应答不需要唯一ID就可以建立起关联。

Bolt不一样,它的问答是乱序的,问和答之间是必须通过请求的唯一ID来建立起关联。Bolt的客户端是线程安全的,它可以同时传递多个请求,连接对象会维护一个正在处理的RPC请求对象字典。当客户端想要发起RPC请求时,它不是从连接池中摘出一个独占连接,而是随意选择一个连接来传递自己的请求,这个连接也可以被其它线程同时使用。

负载均衡

客户端提供了多种复杂均衡的实现,阿里默认使用带权重的随机算法(RandomLoadBalancer),此外还有

  1. ConsistentHashLoaderBalancer 一致性hash,客户端和服务器之间的连接关系(谁跟谁连)比较稳定

  2. LocalPreferenceLoadBalancer 本地环回地址优先,提升本机调用性能

  3. RoundRobinLoadBalancer 循环依次来

  4. WeightedRoundRobinLoadBalancer 带权重的循环依次来

  5. RandomLoadBalancer 这个是带权重的随机,阿里的默认使用

服务器线程模型

服务器采用传统netty多线程模型,一个acceptor线程专门用来接收连接,然后扔给io线程处理读消息并解码成请求对象,最后扔给业务线程池进行处理。

640?wx_fmt=png

心跳

客户端和服务器之间会有定时心跳检测连接的存活,默认30s来一次。tcp的关闭是通过FIN包来通知对方的,如果因为网络问题,对方连FIN包都收不到,那么即使一边关闭了套接字,另一边可能还以为连接正常。所以心跳检测存活机制在长连接应用里非常普遍。如果客户端连续发了三次心跳都没有收到服务器的回复,那么就认为连接已经关闭。服务器也会有连接存活检测,如果一个客户端连接90s内没有任何消息进来,那么也认为该连接已经断开。服务器不会主动发送心跳消息。

双工通信

RPC一般是由客户端向服务器发起一个请求,然后收到服务器的应答。Bolt的RPC是双工通信,服务器也可以向客户端主动发起请求,它们共享一个TCP连接。TCP连接本身就是双工的,所以这也不算什么奇迹。只是服务器在什么业务场景需要向客户端主动发起请求,这个蚂蚁并没有进行详细说明。

640?wx_fmt=png

客户端作为主动连接方,它要负责重连和发起心跳消息。服务器作为被动方,它不需要处理重连,如果连接断开,它就直接将连接从集合中移除就行,不需要做特殊的处理,但是它会检测心跳消息,如果在一定时间内连接通道没有任何消息到来,它就会主动关闭。

重连

客户端的重连策略是一个单独的模块,有两个地方会成为重连的入口。一个是正常连接断开触发channelInActive回调,另一个就是重连连接不能建立成功时需要进行重试。Bolt有一个单独的重连线程,所有需要重连的连接会被包装成一个任务塞进这个线程的任务队列,该线程不断地从队列里拿任务进行重连处理,如果重连失败会尝试再将任务重新包装进队列延后继续处理。默认是1s钟处理一个重连任务。

640?wx_fmt=png

RPC连接是延迟建立的,它在第一次客户端发送RPC请求时尝试进行连接,如果连接失败,它会立即继续重连最多默认两次。如果三次尝试连接后还是没有建立成功,就向上层爆出异常。它不需要包装一个重连任务塞进ReconnectManager,因为后续客户端请求会继续触发连接。

单向消息

RPC通常是一应一答,客户端可以同步等待响应,也可以提供回调接口等待结果通知。Bolt除了提供应答模式之外,还提供了oneway单向消息,这种消息服务器收到后不用回复,客户端发送请求之后就立即返回了也不需要等待结果。

oneway消息一般用于不那么重要的日志类消息,它不能保证服务器一定能收到,所以此种业务消息应该是那种允许丢失的消息,形式上类似于UDP,它在牺牲可靠性的前提下能大幅提升消息的吞吐量。

消息追踪

Bolt提供了回调接口,方便监控系统可以对请求的调用状况进行分析。监控的客户端可以通过实现该接口,注册进RPC的客户端和服务器进行打点收集日志,然后发送到日志分析系统。

interface Tracer {
    void startRpc(SofaRequest request);
    void serverReceived(SofaRequest request);
    void serverSend(SofaRequest request, SofaResponse response, Throwable throwable);
    void clientReceived(SofaRequest request, SofaResponse response, Throwable throwable);
    ...
}

总结

Bolt是一个成熟的比较复杂的RPC系统,这篇小文章只讲解了其中一部分,内部还有大量的实现细节有待去挖掘。

640?wx_fmt=jpeg

阅读相关文章,请关注公众号「码洞」,SOFA开源系列代码是Java程序员的大宝藏,它有太多的项目和代码会让很多用户感到望而生畏,后续我会陆续放出SOFA开源系列其它模块的分析文章,帮助大家轻松理解SOFA项目。

----------------------------------------------------------

近日,码洞新书《深入理解RPC》正式上线,掘金首发销量打破有史以来最高纪录,限时优惠9.9元,感兴趣的读者点击下面的连接进行阅读

深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

640?wx_fmt=jpeg
640?wx_fmt=jpeg
640?wx_fmt=jpeg

沙发螺栓:SOFABolt是基于Netty的轻便,易于使用和高性能的远程处理框架 SOFABolt项目 1.介绍 SOFABolt是Ant Ant金融服务集团开发的一套基于Netty实现的网络通信框架。 为了让Java程序员能够将更多的能源投入到基于网络通信的业务逻辑实现上,而不是过多的纠结于网络整合NIO的实现以及处理难以调试的网络问题,净值应运而生。 为了让中间件开发者能将更多的能量放在产品功能特性上实现,而不是重复地一遍遍制造通信框架的轮子,SOFABolt应该运而生。 Bolt名字取自迪士尼动画-闪电狗,是一个基于Netty最佳实践的轻量,易用,高性能,易扩展的通信框架。这些年我们在微服务与消息中间件在网络通信上解决过很多问题,积累了很多经验,并持续进行进行优化和 立即下载

相关推荐

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 410

SOFARPC(笔记)

SOFARPC

weixin_46949627的博客 3025

第三篇:学习InternVL2.0(探讨代码之训练模块版)

InternVL2的训练模块

qq_69051120的博客 1245

浅谈阿里巴巴蚂蚁金服SOFA微服务开源框架

前言: 提到分布式、微服务,大部分人首先想到的可能是SpringCloud、Duubo等主流框架,但事实上在SpringCloud还未出现之际,蚂蚁金服内部就已经有了一套比较完整的金融级分布式架构Sofa,并且到目前为止,经历了大大小小比较完善的闭环金融场景,如双十一、双十二等。说来也惭愧,之前并未关注到Sofa早已开源,所以一直不敢发布有关Sofa的相关文章,如果对Sofa知之甚少的小伙伴,接下来就和我一起进入一个新世界:Sofa分布式微服务架构。 1.Sofa结构图: ...

weixin_42070918的博客 1万+

windows10 + wsl2安装docker

一、安装wsl https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 1.1以管理员身份运行powershell 1.2执行如下命令 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 1.3重启电脑 1.4 重启电脑后,如果需要安装wsl2, 则安装官方文档继续后续操作,因我...

happytree001的博客 1571

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 337

蚂蚁中间件介绍:SOFA

所有中间件都是为了解决特定领域的某个问题SOFA解决:分布式下的服务和组件管理以及调用繁琐的问题。

Y 4823

大模型驱动时序量化因子自动优化:从WorldQuant回测到实战策略

本文探讨了如何利用大模型驱动时序量化因子的自动优化,构建从创意生成到实战验证的完整流程。通过结合WorldQuant回测平台,搭建自动化流水线,详细拆解了因子生成、回测验证与迭代优化的核心模块。文章分享了从初版实现到进阶优化的实践经验,并指出提示词工程与领域知识注入是关键,旨在实现人机智能协作,提升量化策略研发效率。

wdx012345的博客 803

sofa-bolt(网络通信框架)

SOFABolt 用户手册 蚂蚁通信框架实践 SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。 为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。 SOFABolt的基础功能: 基础通信功能 ( remoting-core ) 基于 N

weixin_41942838的博客 1905

Altium Designer应用技巧13: 四层板的拼版方法

本文介绍在Altium Designer中,进行4层板的拼版方法。Altium Designer有多种拼版方法,本文选择最直观的复制、删帖方法来完成,步骤如下: 1、看一下原始文件,如下图所示,我们要对该板进行拼版操作。 2、通过菜单“报告”-“板子信息”得到板子大小,在这里一般切换为mm比较好操作,我们可以使用快捷键"q"。 3、如果是水平拼版,我们需要关心水平长度;如果是垂直拼版...

snmplink的博客 1万+

使用HART Server PC软件进行HART设备的组态、调试和分析的完整指南

HART协议是一种用于工业自动化中的双向通信协议,能够在4-20mA模拟信号的基础上叠加数字信号,从而实现设备的远程监控和管理。HART协议兼具模拟和数字通信的优点,被广泛应用于过程控制系统中。设备组态:通过软件可以对HART设备进行组态,配置设备参数。设备调试:支持设备的在线调试和故障诊断,方便快速解决问题。数据分析:提供设备运行数据的实时监控和历史数据分析功能。报表生成:支持生成各类报表,便于数据记录和管理。

qq_38334677的博客 2474

最近很火的SOFARPC是什么?带你快速入门SOFARPC

上次我们介绍了sofaboot: https://blog.youkuaiyun.com/csdnerM/article/details/124750460 这次我们来介绍SOFAStack家族中的SOFARPC 首先我们知道了sofaboot是在Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。 那么,sofarpc又是什么呢? SOFARPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力,SOFARPC 是

编码人生 4712

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

蚂蚁金服RPC框架结构分析

蚂蚁金服近期开源了研发多年的SOFA一篮子框架,其中就有一个非常核心的RPC框架,它叫SOFA-BOLT。小编今天花了近一天的时间仔细阅读研究它的源码,阅读过程中遇到了不少问题,蚂蚁金服的相关技术人员都非常耐心的及时解答了我的疑难。这里将我从中学到的知识点一并分享给大家。 SOFA-BOLT基于开源的Netty框架,同时提供了服务器和客户端的实现。它的源码非常值得一读,结构简单,考虑周全,绝不是一...

weixin_34198453的博客 749

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SOFA RPC 详细介绍

简介   SOFA 作为蚂蚁金服自主研发的分布式的系统中间件,包含金融级云原生的架构所需要的各种组件,其中包括微服务的研发框架、RPC调用框架、服务的注册中心、分布式定时任务、限流/熔断机制、动态配置的推送功能、分布式的链路追踪、Metrics监控、分布式高可用队列、分布式事务框架、分布式数据库代理等组件。是在金融领域完整的分布式解决方案。   SOFA作为蚂蚁金服的开源的高性能RPC框架。   ...

初学者 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

透视RPC协议:SOFA-BOLT协议源码分析

前提最近在看Netty相关的资料,刚好SOFA-BOLT是一个比较成熟的Netty自定义协议栈实现,于是决定研读SOFA-BOLT的源码,详细分析其协议的组成,简单分析其客户端和服务端的源...

Throwable 1176

蚂蚁SOFA系列(1) - 聊聊SOFA的模块化

作者:404,转载请注明出处。欢迎关注公众号:404P。 SOFA是蚂蚁自研的一套金融级分布式中间件,目前正在逐步向业界开源。SOFA的全称有两个,最早是Service Oriented Fabric Architecture,即面向服务的架构。随着2018年的开源,其全称改为Scalable Open Financial Architecture,即可扩展的开源金融架构。 SOFA技术栈...

404P 3559

sofabolt-sofa体系的基石

theme: cyanosis highlight: agate 前言 最近从sofarpc摸到sofabolt,它是整个sofa体系的基石,比如说sofarpc里面bolt协议,还有sofaregistry里面pingpong、注册机制也是基于sofabolt通讯框架来实现,可想而知这个框架是基础框架中的基础,哈哈。 下面我们通过源码来认识下sofabolt的实现思路~ 概括 ...

大鸡腿的博客 443

Rpc 和 gRpc 简介汇总

protocolbuffers是google推出的一种数据序列化格式,简称protobuf。优点支持多种编程语言序列化数据体积小反序列化速度快序列化和反序列化代码自动生成缺点可读性差,缺乏自描述性下图(左JSON,右Protobuf)是同样的一段数据,用json和protobuf分别描述(仅表示描述方式,并不是最终生成的序列化数据)。可以看出,protobuf是把json中的key去掉了,用数字代替key,从而实现了减小了序列化后的数据大小。}...

神棍之路 6396

sofa-bolt是什么?

1、sofa-bolt是什么? 2、解决什么问题? 3、从哪里可以下载? 4、如何使用? 5、使用场景?

G探险者的博客 685

SOFA 相关框架你有没有听过?

一、 前言 1、什么是 SOFA? SOFA 是 Simple Object-oriented and Flexible Architecture 的简称,是阿里巴巴国际技术事业部自研的专门针对复杂业务场景的应用架构 SOFA是蚂蚁自研的一套金融级分布式中间件,目前正在逐步向业界开源。SOFA的全称有两个,最早是Service Oriented Fabric Architecture,即面向服务的架构。随着2018年的开源,其全称改为Scalable Open Financial Architectur

欢迎来到 ABin-阿斌的博客:写一生代码,创一世佳话,筑一览芳华。 2798

SOFABolt:高性能网络通信框架的佼佼者

在现代分布式系统中,网络通信是连接各个服务节点的桥梁,其性能和稳定性直接影响到整个系统的运行效率。为了帮助开发者更专注于业务逻辑的实现,而非底层网络通信的复杂性,蚂蚁金融服务集团推出了SOFABolt——一个基于Netty实现的轻量、易用、高性能、易扩展的网络通信框架。 ## 项目介绍 SOFABolt,全称为SOFA Bolt,是蚂蚁金服自主研发的一款高性能网络通信框架。它基于Netty的最...

gitblog_00174的博客 1067

Java微服务商城高并发秒杀项目--016.自定义网关路由规则

自定义网关路由规则

陆潇亮的博客 193

蚂蚁集团网络通信框架 SOFABolt 功能介绍及协议框架解析 | 开源

< SOFA:Channel/ >,有趣实用的分布式架构频道。回顾视频以及 PPT 查看地址见文末。欢迎加入直播互动钉钉群 : 30315793,不错过每场直播。大家好,我是...

金融级分布式架构 1333

SOFARPC 框架

微服务已经被广泛应用在工业界,微服务带来易于团队并行开发、独立部署、模块化管理等诸多优点。然而微服务将原单体拆分多个模块独立部署,各模块之间链接变得错综复杂,在大规模分布式系统中这种复杂链路给维护带来了诸多困难。如果对整个微服务架构不能了然于胸,便很难理清各模块之间的调用关系。例如修改一个服务接口,对哪些服务造成影响不能快速定位。SOFARPC 在 5.4.0 以后提供了链路追踪技术,可以有效协助开发运营人员进行故障诊断、容量预估、性能瓶颈定位以及调用链路梳理。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 826
上一篇: Python最广为使用的并发库futures使用入门与内部原理
下一篇: 跟着动画学习TCP三次握手和四次挥手
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值