【剖析 | SOFARPC 框架】系列之 SOFARPC 数据透传剖析

简介: Scalable Open Financial Architecture是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

SOFA

Scalable Open Financial Architecture

是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

本文为《剖析 | SOFARPC 框架》第八篇,作者水寒,目前就职于网易。

《剖析 | SOFARPC 框架》系列由 SOFA 团队和源码爱好者们出品,
项目代号:,官方目录目前已经全部认领完毕,文末提供了已完成的文章目录。


image.png

前言

在《剖析 | SOFARPC 框架》系列之前的文章中,我们已经介绍了同步,异步,泛化调用等,也介绍了链路追踪的能力。

本篇,我们将介绍一下 SOFARPC 中另一种内置的数据透传的能力。依次介绍,数据透传的概念, SOFARPC 的设计原理,以及各种不同调用方式下的透传使用和详细说明,最后, 还会比较一下和 SOFATracer 的区别。欢迎大家与我们讨论交流。

数据透传介绍

首先,我们知道,在 RPC 调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以。在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息。业务方可能希望,在每一次调用请求中都能够传递一些自定义的信息到下游。甚至也希望下游能够将一些数据传递回来。

而数据透传功能,就是指数据不需要以作为方法参数的形式在调用链路中进行传递,而是直接存储到调用上下文中,之后通过 RPC 的内置对象,进行传递,调用双端可从上下文中获取数据而不需要去关注数据的传输过程。SOFARPC 提供的数据透传支持请求数据透传(客户端向服务端)和响应数据透传(服务端向客户端)

SOFARPC 设计原理

这里主要是介绍一下,实现的核心原理,更加具体的每种调用方式的透传,在后文中都会详细介绍。

image.png

  • 用户通过 SOFARPC 提供的 API 进行数据传递设置
  • SOFARPC 在调用传输前,将透传的数据进行打包获取
  • 进行正常的序列化和反序列化
  • SOFARPC 在反序列化时将用户设置的透传数据写回 Context
  • 服务端用户即可进行获取使用

不同调用方式的透传

我们知道,SOFARPC 目前支持四种调用模式,如果没有阅读过之前文章的同学,可以阅读一下 SOFARPC 同步异步实现剖析 。四种调用模式下,请求透传数据的原理都是一样的,服务端设置响应透传数据的原理也是一样的,只是客户端获取响应透传数据的方式有所不同(后三种模式只介绍客户端获取响应透传数据的原理)。

因此我们会介绍下不同调用方式的透传细节,并介绍其使用方式,方便大家理解。以下为了方便说明,我们会使用如下的接口示例

接口服务

public interface HelloService {
    String sayHello(String string);
}

服务实现

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String string) {
        // 获取请求透传数据并打印
        System.out.println("service receive reqBag -> " + RpcInvokeContext.getContext().getRequestBaggage("req_bag"));
        // 设置响应透传数据到当前线程的上下文中
        RpcInvokeContext.getContext().putResponseBaggage("resp_bag", "s2c");
        return "hello " + string + " !";
    }
}

后续的所有调用模式都使用HelloServiceImpl这个服务实现。(示例代码在 SOFARPC 的测试 case 中都要对应的示例,大家可以对应阅读)

对用户可见的操作 API 只有一个就是 RpcInvokeContext,在 SOFABoot 和 SOFARPC 下都适用,当然如果你了解 SOFARPC 的 Filter 机制,也可以通过扩展这个来实现。

一、sync 调用下的透传
使用示例
image.png

原理剖析
image.png

请求透传数据
客户端首先在 main 线程(图中的user thread)中设置请求透传数据到其调用上下文RpcInvokeContext.requestBaggage属性中,之后在调用过程中从requestBaggage中取出请求透传数据并设置到SofaRequest.requestProps属性中。

服务端接收到请求SofaRequest对象后,在其调用链中的 ProviderBaggageFilter#invoke 方法中会先从SofaRequest.requestProps中取出请求透传数据并设置到当前服务端线程的调用上下文RpcInvokeContext.requestBaggage属性中,最后业务代码就可以从调用上下文中获取请求透传数据了。

响应透传数据
服务端设置响应透传数据到其调用上下文RpcInvokeContext.responseBaggage属性中,之后在ProviderBaggageFilter#invoke 方法中先从responseBaggage中取出响应透传数据并设置到SofaResponse.responseProps属性中。

客户端main线程被唤醒后,先从SofaResponse.responseProps中获取响应透传数据,之后将响应透传数据设置到其调用上下文RpcInvokeContext.responseBaggage中,最后业务代码就可以从调用上下文中获取响应透传数据了。

二、oneway 调用下的透传
使用示例

image.png

原理剖析

image.png

在 oneway 模式下,客户端不接受服务端响应,也不会获取响应透传数据。

三、future 调用下的透传
使用示例
image.png

原理剖析

image.png

客户端获取响应透传数据
future 模式在 SOFARPC 内部会被转化为 callback 的方式进行调用,在 callback 对象中会存储main线程的调用上下文;当客户端接收到响应时,会执行该 callback 对象的回调函数,在其回调函数中,对于响应透传数据,会做如下操作:

从SofaResponse.responseProps中获取响应透传数据

从 callback 对象中获取 main 线程的调用上下文

设置响应透传数据到 main 线程的调用上下文

将 main 线程上下文拷贝到当前的回调线程中

实际上,第三步与第四步在 SOFARPC 源码中顺序相反,本文这样解读是为了更容易理解。这样无论是 future 模式(从 main 线程的调用上下文获取响应透传数据)还是 callback 模式(从回调线程的调用上下文获取响应透传数据),都可以顺利的获取到响应透传数据。

四、callback 调用下的透传
使用示例

image.png

原理剖析

image.png

与future模式原理一样,只是最终业务代码中是从回调线程而不是main线程的调用上下文中获取响应透传数据。

与 SOFATracer 的比较

如果了解过 SOFATracer 的同学会有疑问,这个跟 Tracer 是不是有功能上的重叠呢?实际上 SOFATracer 是蚂蚁开源的一个分布式链路追踪系统,SOFARPC 目前已经和 Tracer 做了集成,默认开启。

和 Tracer 进行数据传递不同的是

  • SOFARPC 的数据透传更偏向业务使用,而且可以在全链路中进行双向传递,调用方可以传给服务方(请求透传数据),服务方也可以传递信息给调用方(响应透传数据),SOFATracer 更加偏向于中间件和业务无感知的数据的传递,并且只能进行单向传递。也就是向下传递,调用方并不能获取服务提供方的透传数据。
  • SOFARPC 的透传可以选择性地不在全链路中透传(主动清除调用上下文数据),而 Tracer 中如果传递大量信息,会在整个链路中传递。可能对下游业务会有影响。

所以整体来看,两种方式各有利弊,在有一些和业务相关的透传数据的情况下,可以选择 SOFARPC 的透传。

目录
相关文章
|
10月前
|
存储 人工智能 算法
AI时代数字营销的底层重构:于磊老师深度解析Geo未来发展趋势展望
随着AI技术重塑数字营销,生成式引擎优化(GEO)正取代传统SEO。本文结合15年经验专家于磊的洞察,探讨GEO未来发展趋势:以E-E-A-T构建内容权威,倡导人性化表达与生态规范化,反对黑帽行为,推动AI时代可持续、有温度的营销新范式。
734 8
|
5月前
|
前端开发 开发者
前端组件库——Radix UI知识点大全(二)
教程来源 http://yvyus.cn/ Radix UI提供50+无样式、高可访问性React原语组件,如Dialog、DropdownMenu、Popover等,内置ARIA支持、键盘导航与焦点管理,专注交互逻辑,样式完全由开发者掌控。
|
5月前
|
人工智能 安全 量子技术
最新软件技术全景解读(第一篇)
教程来源 https://zlpow.cn/category/artificial-intelligence.html 2026年,AI正从“对话工具”跃升为自主行动的智能体,软件工程范式由“写代码”转向“编排智能体”。算力重心向推理侧迁移,边缘智能、RISC-V、量子计算加速落地。本文从智能体革命、AI基础设施、软硬融合与开发范式重构四维,解析技术新图景。
|
4月前
|
存储 安全 网络安全
APP运营服务器配置全攻略:从选型到网络安全,你需要知道的一切
服务器配置与网络安全是APP稳定运营的双重基石:前者决定响应速度与高并发承载力,后者守护用户数据与业务安全。本文系统解析CPU/内存/带宽/存储选型、分阶段配置策略、云原生架构及WAF/RASP/零信任等纵深防御体系,助您构建高性能、高可用、高安全的APP基础设施。(239字)
|
9月前
|
人工智能 缓存 监控
2025年优测全链路压测平台:高并发卡顿环节精准定位实践
文章围绕2025年高并发场景下系统卡顿问题,阐述全链路压测是精准定位卡顿环节的主流技术。介绍主流全链路压测平台类型及差异,分析卡顿定位面临的挑战,重点讲解优测全链路压测平台的技术优势与实践,还给出落地全链路压测的方法及方案选择建议。
|
9月前
|
人工智能 缓存 算法
为什么你学了那么多算法,代码性能还是“一塌糊涂”?
本文针对开发者普遍存在的“学了算法却写不出高性能代码”的痛点,提供了一套系统化的“算法优化AI指令”。该指令旨在引导开发者建立“分析-设计-验证”的工程化思维,通过结构化的提问框架,让AI成为辅助性能优化的“私人教练”,从而将零散的算法知识转化为体系化的实战能力。
442 7
|
11月前
|
机器学习/深度学习 人工智能 算法
计算机的起源
从机械齿轮到量子计算,计算机的演进是一部人类智慧的史诗。本书讲述跨越五千年的计算文明史:从算盘到AI,从巴贝奇到图灵,揭示科技背后的逻辑与梦想,展现数字时代如何重塑世界。
|
安全 前端开发 网络安全
2025年最受欢迎的CMS系统。
在2025年,国内知名CMS系统PageAdmin CMS、国外博客程序Wordpress、PHP论坛系统discuz和电子商务商城系统PrestaShop将为用户提供强大、灵活、易用的CMS管理系统。
1232 63
|
JSON 安全 Serverless
MCP Server 之旅第 2 站: 从 0 到 1 - MCP Server 市场构建与存量 OpenAPI 转 MCP Server
本文聚焦MCP协议在企业应用中的两大核心痛点:如何将社区主流STDIO MCP Server一键转为可插拔Remote MCP Server,以及如何实现存量OpenAPI向MCP Server的智能化转型。文章通过具体示例,展示了基于函数计算和协议转译Adapter的解决方案,支持npm/pip生态,实现零改造一键迁移,大幅降低成本。
|
Java 数据处理 数据库
Java一分钟之-Spring Batch:批量处理框架
【6月更文挑战第11天】Spring Batch是Spring家族的批处理框架,简化了批量处理任务的开发。它包含Job、Step、ItemReader、ItemProcessor和ItemWriter等核心组件,用于构建数据处理流程。本文讨论了批量处理中的常见问题,如内存溢出、事务管理和异常处理,并提供了相应的解决策略。通过添加相关依赖、定义Job和Steps,以及启动Job的示例代码,帮助开发者开始使用Spring Batch。了解其核心概念和最佳实践,能提升批量处理系统的效率和可靠性。
726 4

热门文章

最新文章