写点什么

基于 Dubbo,如何利用 APISIX 构建跨网 RPC

  • 2023-10-30
    北京
  • 本文字数:4502 字

    阅读完需:约 15 分钟

大小:2.12M时长:12:21
基于 Dubbo,如何利用APISIX 构建跨网 RPC

作者|王晓彬

 

为解决数据跨网问题,政采云搭建了一条基于 Dubbo 的“高速公路”,同时采用了 APISIX 作为中心网关,为网络路由、公共特性提供支持。本文将重点介绍政采云“高速公路”工程建设中如何采用节流策略来应对挑战。我们将讨论链路协议的优化实践以及对网络传输效率的思考。

 

政采云平台是一个政府采购专属平台,为各级政府部门和国有企业提供支持。从网络架构的角度来看,政采云平台是一个集合了公有云、私有云和政务云的混合云网络。所以对于业务来说,跨网数据传输是一个常见的需求场景。

 

为了满足这种需求,政采云“高速公路”工程于 2022 年底启动,旨在整合现有的网络传输方案,提供一致、便捷和高速的跨网业务体验。随着跨网方案整合的推进,公司的跨网流量越来越多地流向了新型基础设施——政采云“高速公路”工程。

 

挑战

 

“高速公路”方案得到了公司的支持,在 2023 年上半年通过新业务的试点后,下半年开始陆续迁移历史跨网方案的业务。从监控中,我们感受到了来自流量的压力。具体表现为:

 

  • 心跳应用告警频繁发生。

  • 监控指标如响应时间(RT)和吞吐量下降。

 

为了确保业务的稳定性并提高用户体验,我们采取了各种优化措施。总体而言,我们主要探索了两种思路:

 

  1. 资源优化:这种优化思路相对较简单,主要涉及资源的重新调配。具体措施包括对单点的中心网关和 Dubbo 网关进行资源隔离,以最小化故障对系统的影响。此外,通过直接增加 pod 等方式,也能有效缓解压力。这样可以确保在资源方面有足够的储备,以满足系统在高负载情况下的需求。

  2. 性能优化:这一思路需要在架构层面进行深入优化,以尽可能填补木桶模型的短板。这是非常重要的,因为只有通过性能的最大化利用,才能实现系统的水平扩展。

 

综合考虑这两种思路,可以在资源充足的同时,通过性能优化来确保系统的稳定性和高可用性。这种综合策略通常是解决高压力环境下的系统性能问题的有效方法。

问题与目标


跨网 RPC(“高速公路”)的主要流程

 

  1. 客户端发起请求,包括生成代理、方法调用、参数返回的序列化,发起网络请求;

  2. 基于 Dubbo 协议的本地网络传输;

  3. 出口网关(基于 Dubbo 的 Java 应用)转发,涉及获取请求、反序列化参数、HttpClient 转发;

  4. 基于 HTTP 协议的公网网络传输;

  5. APISIX 中心网关转发;

  6. 基于 HTTP 协议的公网网络传输;

  7. 入口网关转发,涉及获取请求、HTTP 包拆解、参数序列化、Dubbo 泛化转发;

  8. 基于 Dubbo 协议的本地网络传输;

  9. 服务端接收请求,获取数据、反序列化参数、方法调用、序列化结果,返回数据;

  10. 原路返回,同请求流程。

 

整个流程对性能影响比较大的环节有:Sdk 行为 [1,9],网络传输 [2,4,6,8] 和网关行为 [3,5,7]。其中,Sdk 行为涉及到 RPC 框架选型,在当前公司已经广泛使用 Dubbo 的背景下,可以先不考虑。需要重点考虑的,则是网络传输中协议的选择以及网关对性能的影响。

 

传输协议问题

 

鉴于现有背景,用户通常希望使用本地 Dubbo 一样直接跨网。所以。“高速公路”工程的设计是围绕 Dubbo 框架的特性进行的。

 

与业务对接中,经常会被问到,我们使用了 Dubbo 的某个特性,你们能否支持?出于对场景支持的考虑,在设计“高速公路”架构时,我们重点考虑了接近原生体验的特性。为此,我们设计了隧道机制。现在,基于这一特性,我们可以轻松地对业务说:“是的,可以支持!”

 

隧道机制方案的中间层使用了 HTTP 协议作为隧道协议,它可以穿透层层网络设备和网关,是比较稳健的一种方式。但是在流量压力下,整体的性能/吞吐量,逐渐成为当前方案的主要矛盾。

 

首先,在协议层面,我们先要了解下 HTTP/1.1 协议存在的性能问题。

 

  • HTTP 头部巨大且重复,由于 HTTP 协议是无状态的,每一个请求都得携带 HTTP 头部,特别是对于有携带 Cookie 的头部,而 Cookie 的大小通常很大;

  • 队头阻塞问题,同一连接只能在完成一个 HTTP 事务(请求和响应)后,才能处理下一个事务;

 

为此,我们需要寻找一个更加高效的传输层协议来代替 HTTP/1.1。

 

网关问题

 

另外一个比较明显的瓶颈,是本地集群内的 Dubbo 网关。

 

Dubbo 网关负责接收来自本地客户端的 Dubbo 协议数据,反序列后通过 HTTP 转发至公网中心网关。因为市面上没有 Dubbo 转 HTTP 的网关,第一个版本我们选择了自研。在转发效率上,显然有天然的不足。主要有以下几个原因:

 

  1. 对网关本身性能的担忧。比如下图中,Spring Cloud Gateway 对比其他网关的性能表现不足。同样是基于 Netty 的 Java 网关,我们也没有信心能比 Spring Cloud Gateway 更优秀。


图片来源见参考资料

 

  1. 额外的参数序列化程序。由于需要转换协议,网关需要额外的一次序列化和反序列化。同时由于 Dubbo 网关不存在业务参数对象,我们需要一个通用的 JavaBean 描述对象作为过渡,这又增加了一次转换。

  2. HttpClient 串行阻塞式的通信方式,将大大的降低并发效率。

 

为了解决上述问题,我们需要一个类似于 NGINX 的高性能、非阻塞的网关来实现高效的反向代理,并使用更精简的通信协议来提高吞吐量。

 

优化方案

 

协议方面

 

协议方面,我们尝试使用了 Dubbo 协议作为隧道协议。这能带来哪些收益呢?简而言之包括两个方面。

 

  • 减少包的大小,提高网络吞吐量

 

Dubbo 协议更加精简,承载的头部信息更少。协议设计上很紧凑,能用 1 个 bit 表示的,不会用一个 byte 来表示,比如 boolean 类型的标识。Http 为了更好的兼容性,请求头部携带了很多上下文和元数据。对于内部通信来说,服务端和客户端相对固定,很多信息是没有必要的。以下是 Dubbo 官方性能测试,Tps(每秒处理事务量)Dubbo 协议比 Http 高 30%-50%左右(最常见的高并发小数据量场景)。

 


另外,Dubbo 使用长连接,可以重复使用已经建立的 TCP 连接,减少了连接建立的开销。

 

  • 传输协议开销

 

由于整条链路使用了相同协议,可以避免不同协议间的装包和解包。

 

网关方面

 

网关方面,我们使用了 APISIX 代替 Dubbo 网关。

 

APISIX 是基于高性能的 OpenResty 开发的,从架构和设计角度对性能追求极致,因此可以满足我们对网关性能的基本要求。同时,它具有出色的扩展性,能够满足我们的自定义需求。简而言之,我们既希望享有类似 NGINX 的高性能,又希望可以根据需要扩展功能。

 

APISIX 实现了 xRPC 四层协议扩展框架,允许开发人员自定义特定于应用程序的协议。基于 xRPC 框架,APISIX 可以提供几种主要应用协议的代理实现,用户还可以基于该框架支持自己私有的基于 TCP 的应用协议,使其具有类似于 HTTP 协议代理的精确粒度和更高级别的 7 层控制。通过使用 APISIX 的 xRPC 扩展,我们成功地增加了对 Dubbo 协议的直接转发功能,从而实现了全链路 Dubbo 协议传输。

 

这一举措解决了之前提到的两个问题:显著提升了网关性能,同时减少了协议转换的成本。此外,我们也不再需要维护额外的应用网关,实现了中间件层面的收敛。

 

我们已经通过 PR (https://github.com/apache/apisix/pull/9660)的方式将上述特性提交给 APISIX 社区,因此下一个版本中我们将能够直接使用开源版本。

 

注:APISIX 的 Dubbo 插件支持 HTTP 转 Dubbo,目前没有 Dubbo 直接转 Dubbo 的方式。虽然 Dubbo 协议是私有协议,但是 Dubbo 框架的应用非常广泛,这一特性可能会有很多意想不到的用法。

 

本轮改造不足

 

2022 年下半年,我们对各跨岛方案,进行了整合升级,也就是现在的“高速公路”方案,保障跨岛标准化同时,解决了之前方案实践过程中面临的很多业务痛点。通过替换隧道协议,我们希望优化网络 IO 模型,提高链路转发效率。经初步测试,单次 2k 包请求 RT 可以降低 1/3 左右。

 

但是,在实践业务场景中,该架构下一些痛点也开始逐渐显现。

 

支持场景不足

 

对云岛业务结构的公司来说,云平台属于公司内部、完全可控的局域网,而岛端则是有自己安全网络策略的独立内部网络。我们的跨网 RPC 需要穿透混合云网络中的各种设备和网关,到达云岛的另一头服务。Dubbo 协议作为私有协议,在大部分的跨岛场景中并不适用。

 

目前,这种模式只能在内部的一些网络使用,比如独立搭建的 AI 集群和平台业务集群的通信。

当然,基于“高速公路”架构的良好扩展性,我们可以做到不同场景自动切换协议,在获得 Dubbo 协议优势的前提下,也能退化 HTTP 协议兜底。

 

对网络吞吐量的优化不足

 

接口需要发送大量数据时,这些数据无法被放在一个 RPC 的请求或响应中,需要分批发送。

Dubbo 协议下,这种情况只能串行发送。Dubbo 协议在单次请求下性能较好,但是整体吞吐量的提升仍然不够。

 

在我们的跨网第一个版本上线前,曾经做过性能压力测试。测试场景如下:

 

云端调岛,上行数据,30M 带宽,发送 2KB 数据,逐步增大并发量。

 


30M 入口带宽,发送 2KB 数据,TPS 大于 500/s,入口带宽将成为瓶颈。当发送数据增加到 80KB,TPS 下降约 16 倍,RT 上升约 1.5 倍。

 

从监控上看,tps 到达一定量后,带宽即达到上限。

 


可以看到,当前“高速公路”的实际业务场景下,吞吐量是“高速公路”第一个版本最大的一个瓶颈。此次网关和协议的升级,显著降低了 RT 指标,一定程度提升了整体吞吐量。

 

后续规划


经过对 APISIX 的协议扩展,我们使用 APISIX 代替了 Dubbo 自研网关,基本实现了对通信效率的预期优化。但是,我们也有支持场景和通信效率两个明显的痛点需要解决。

为此,我们重点调研了 Dubbo3 主力通信协议——Triple 协议。

 

Triple 协议是 Dubbo3 设计的基于 HTTP 的 RPC 通信协议规范,它完全兼容 gRPC 协议,支持 Request-Response、Streaming 流式等通信模型,可同时运行在 HTTP/1 和 HTTP/2 之上。对于我们项目来说,Triple 协议的几个特性刚好是我们欠缺的。

 

  • 完全兼容基于 HTTP/2 的 gRPC 协议

 

Triple 协议听起来是个私有协议,实际上则是标准的公有协议,兼容 HTTP/1 和 HTTP/2。这意味着穿透性强,痛点之一的场景支持就不再是问题了。

 

对比 HTTP/1,二进制分帧带来的并行效率提升,首部压缩减少大量包体,在网络吞吐量上,HTTP/2 在性能上有了极大提升。

 

  • 作为 Dubbo 主力协议,仍然保留着避免协议转换的优势,与“高速公路”架构契合

  

经过 Dubbo2 协议的实践与总结,我们将着力推动 Triple 协议的升级,完美解决性能问题。

 

未来,我们将按以下几步进行:

 

  1. 助力开源项目 APISIX 扩展 Triple 协议

 

APISIX 本身有着非常优秀的扩展性,同时有 Dubbo2 协议的经验,相信这一步会比较顺利。

 

  1. 推动公司 Triple 协议的升级

  

今年政采云整体升级完 Dubbo3,后面升级协议也将是一个可选项。

 

  1. 性能压测验证

 

对于当前架构,之前做了完整的压力测试,也明白瓶颈所在。后续我们将持续测试,深挖这一基础设施的性能潜力。

 

参考资料:

https://www.jianshu.com/p/7182b8751e75

https://www.infoq.cn/article/qfcz1fj9wvFvGidjpcho

https://zhuanlan.zhihu.com/p/432512918

https://cn.dubbo.apache.org/zh-cn/docsv2.7/user/perf-test/

 

作者介绍:

王晓彬,Apache Dubbo Commiter、政采云资深开发工程师,负责基础服务相关工作。

2023-10-30 10:282900

评论

发布
暂无评论
发现更多内容

Nautilus Chain 首个生态基础设施 Poseiswap,公布空投规则

鳄鱼视界

在GitHub首页3分钟被下架!爱奇艺《高并发网关设计》笔记被盗?

做梦都在改BUG

Java 负载均衡 高并发 网关设计

一看就懂,一学就会的Raft解析

爱德华

raft PAXOS 共识算法 深入理解分布式共识算法

云原生容器高可用运维能力应用

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

几种快速传输大文件的方式

镭速

LED显示屏与DLP拼接屏的优缺点分析

Dylan

LED LED显示屏 户外LED显示屏

超级MMM互助盘DAPP系统开发源代码(案例演示)

开发微hkkf5566

连接 AI,NebulaGraph Python ORM 项目 Carina 简化 Web 开发

NebulaGraph

Python ORM 图数据库

深度访谈 NXTF_ 负责人|虚实联动才是通向未来的数字通行证

万事ONES

官方文档 | 【JVM调优体系】「GC底层调优实战」XPocket为终结性能问题而生—开发指南

洛神灬殇

Java JVM 3月日更 XPocket 技术 优化体系

Flink 流批一体方案在数禾的实践

Apache Flink

大数据 实时计算 flinkl

一文告诉你如何一键复现“TSBS 时序数据库性能基准测试报告”测试结果

TDengine

tdengine 性能测试 时序数据库

百套Web工业组态模板图库(长期更新)

2D3D前端可视化开发

组态软件 工业组态 组态图库 web组态图库 组态界面

字节跳动 Flink 大规模云原生化实践

Apache Flink

大数据 flink 实时计算

人工智能迎来iPhone时刻,拟人化AI进入爆发前夜

硬科技星球

互联网工程师1480道Java面试题及答案整理( 2023年 整理版)

Java你猿哥

Java 面试 面经 春招 Java八股文

基础篇丨链路追踪(Tracing)其实很简单

阿里巴巴云原生

阿里云 云原生 Tracing

如何使用责任链默认优雅地进行参数校验?

做梦都在改BUG

Github上获赞59.8K的面试神技—1658页《Java面试突击核心讲》

Java你猿哥

Java 架构 面试 面经 春招

扫盲篇:Java中为啥一个 main 方法就能启动项目?

Java你猿哥

Java JVM ssm Java工程师

Nautilus Chain 首个生态基础设施 Poseiswap,公布空投规则

威廉META

面试必问:JVM 如何确定死亡对象?

做梦都在改BUG

Java 面试 JVM

Alibaba官方上线!Java并发编程全彩图册(终极版)GitHub已置顶

做梦都在改BUG

Java 并发编程 多线程 高并发

Linux 的 TCP 连接数量最大不能超过 65535?

Java你猿哥

Java Linux 后端 ssm

专业的RAW图片处理:DxO PhotoLab 6 中文直装版

真大的脸盆

Mac Mac 软件 raw raw图片处理软件 Raw图像处理软件

测试流程规范如何推动落地?

老张

软件测试 目标识别 流程规范

普通程序员要成为架构师,需要掌握哪些知识体系?

程序员小毕

Java 面试 程序人生 后端 架构师

IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践

JackJiang

即时通讯 即时通讯IM

最全金融数据安全政策汇编,你应该需要它!( 附下载 )

极盾科技

数据安全

云图说 | MSSI之应用业务模型ABM,搭建业务与技术的数据治理桥梁

华为云开发者联盟

大数据 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

YRCloudFile V6.10.0 功能新增对 NVIDIA GPUDirect 与回收站的支持

焱融科技

#高性能 #分布式文件存储 #文件存储 #全闪存储 #容器存储

基于 Dubbo,如何利用APISIX 构建跨网 RPC_云计算_王晓彬_InfoQ精选文章