当前位置: 首页 > news >正文

【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现

盘点本年度探索对外服务的百万请求量的API网关设计实现

  • 背景介绍
    • 高性能API网关
      • API网关架构优化
        • 多级缓存架构设计
          • 多级缓存富客户端
            • 漏斗模型数据读取架构
        • 异步刷新过期缓存
        • 网关异步化调用模型
        • 高性能批量API调用(减少对于网关的交互和通信)
          • 并行调用和请求合并的策略
        • 多维度流量控制
          • 规则分配和归属分组
          • 动态调整规则和热插拔
        • 良好控制网络拥塞

背景介绍

公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。

高性能API网关

各个业务系统如商品中心、交易平台和用户中心等,均独立运作并持有各自的数据。为了实现这些系统间的数据交换,我们采用Dubbo3以及OpenFegin作为通讯框架。

为了确保数据的安全与可控性,我们面临着一个挑战:如何将这些数据开放给外部客户,以共同构建一个数据共享的数据平台化体系。

API网关架构优化

API网关通过采用管道设计模式,高效处理业务逻辑、安全保障、服务路由和调用等关键任务。为应对高并发请求,网关在架构上进行了针对性的优化,以确保能够应对近百万峰值QPS的挑战。

主要集中在以下这几点:
在这里插入图片描述
该架构能够支持千万级QPS(Queries Per Second)的请求。这意味着它被设计为能够处理大量的并发请求,这通常与高可用性、高性能的系统相关。

多级缓存架构设计

在API调用链路中,对元数据的获取至关重要,涉及多个关键信息,如API的流控信息、字段等级、类目详情、APP密钥、IP白名单、权限包数据以及用户授权信息等。在高并发场景下,元数据获取的QPS需求高达千万级别,因此优化元数据获取的性能成为API网关的核心挑战。
在这里插入图片描述
多级缓存架构:主要涉及元数据的读取,并为此采用了富客户端多级缓存的设计,这种设计的主要目的是为了提高数据读取的效率并减少对原始数据源的直接访问,缓存能够存储常用的数据,从而在需要时快速提供,而不是每次都去原始位置获取。

“多级”意味着缓存被设计为多层次,每一层都比前一层更接近数据源。这种层次结构可以更好地管理数据的生命周期,并能够逐层缓存数据。

多级缓存富客户端

在面临千万级QPS的元数据读取需求时,直接将所有请求打到数据库是不可取的,即便数据库已经进行了分库分表的处理。为了提升性能和响应速度,我们在数据库之前增加了一层分布式缓存,用于缓解数据库的压力。

  • LRU(Least Recently Used)规则的本地缓存:支撑千万级QPS的读取需求意味着需要部署近百台缓存服务器,这不仅增加了硬件成本,还可能因为过多的网络请求而导致性能瓶颈。为了进一步提升效率和降低成本,在分布式缓存之前引入了基于LRU(Least Recently Used)规则的本地缓存。这种策略能够优先保留最近访问的数据,从而最大限度地减少了对分布式缓存和数据库的访问次数。

  • 防止缓存被击穿:即当缓存中没有数据且数据库中也没有数据时,大量的请求会直接打到数据库上,我们在本地缓存之前增加了一层BloomFilter。

BloomFilter作为一种空间效率极高的概率数据结构,能够快速地判断一个元素是否可能存在于某个集合中,从而避免了不必要的数据库查询。

漏斗模型数据读取架构

构建了一套基于漏斗模型的元数据读取架构,如下图所示。该架构中的缓存控制中心能够动态地推送缓存规则,包括数据是否进行缓存、缓存时长以及本地缓存的大小等。
在这里插入图片描述
此外,为了解决缓存数据过期时可能出现的并发请求问题,网关会容忍在极端情况下拿到过期的元数据。由于大多数情况下对数据的时效性要求不高,这种策略能够有效地避免缓存数据过期导致的性能问题。同时,网关会异步提交任务来更新数据信息,确保数据的准确性和时效性。

异步刷新过期缓存

当某些数据过期或不再有效时,不是立即从源头重新获取,而是安排在后台异步地进行刷新。这种方式可以确保前台的服务或应用不受数据过期的影响,继续提供快速的数据访问。
在这里插入图片描述

网关异步化调用模型

同步调用受限于线程数量,而线程资源宝贵,在 API 网关这类高并发应用场景下,一定比例的 API 超时就会让所有调用的 RT 升高,异步化的引入彻底的隔离 API 之间的影响。

  1. 前置校验与请求分发

    • 当外部请求到达网关时,首先由Servlet线程进行API调用的前置校验。这一步骤包括验证请求参数、权限检查等。
    • 若校验通过,Servlet线程将根据业务逻辑决定使用Dubbo或HTTP NIO client发起远程服务调用。
    • Dubbo或HTTP NIO client负责建立连接、发送请求,并等待远程服务的响应。在此过程中,Servlet线程被释放,不再阻塞。
  2. 异步响应处理

    • 一旦Dubbo3或HTTP请求获得响应,系统以事件驱动的方式通知Worker工作线程池。这种通知机制确保了响应处理的高效和即时性。
    • Worker工作线程从线程池中获取任务,并基于响应结果和API请求的上下文信息进行后续的数据处理。这可能包括数据转换、业务逻辑处理、结果封装等。
  3. 异步输出与响应

    • 数据处理完成后,Servlet 3.0的异步处理特性被激活。这允许网关在不阻塞Servlet线程的情况下,将处理结果输出给外部调用请求。
      在这里插入图片描述
      此架构流程通过前置校验、异步远程服务调用、事件驱动的工作线程处理以及Servlet 3.0的异步输出,实现了请求的全异步化处理。这不仅提高了系统的并发性能,还优化了资源利用,使得网关能够高效、稳定地处理大量外部请求。
高性能批量API调用(减少对于网关的交互和通信)

在高并发场景下,OpenAPI-Server系统面临着巨大的挑战。为了提高OpenAPI-Server处理请求API的性能,降低请求响应时间和网络消耗,我们采取了一系列措施。

并行调用和请求合并的策略

需要调用多个API才能完成某项业务的逻辑单元。传统的串行调用模式会导致较长的响应时间(RT)和过多的网络报文传输,特别是在网络环境不稳定的情况下,这一问题更加突出。

如下图所示:
在这里插入图片描述
为了优化这一流程,我们提出了并行调用和请求合并的策略。通过并行调用,多个API可以同时被请求,从而显著减少总体响应时间。如下图所示:
在这里插入图片描述
而请求合并则能够将多个API请求合并为一个,减少不必要的网络传输和报文重复,进一步降低网络消耗。

多维度流量控制

API网关面临日调用量高达百万及千万的挑战,尤其在业务热期,调用基数庞大、调用者众多,且各API服务能力不均。为确保各API稳定服务,不被流量冲垮,多维度流量控制成为API网关的关键环节。

提供包括API每秒流控、单日调用量控制及APPKEY单日调用量控制等在内的通用流量控制规则。流量控制面临特殊挑战,如单个API能力有限,无法满足实际调用需求。

规则分配和归属分组

API网关通过流量分组策略,灵活配置各组别比例,确保核心业务调用优先通过。核心调用放入分组1,实时性要求高的调用放入分组2,其余放入分组3。

动态调整规则和热插拔

此策略提高了核心和实时性要求高的调用的成功率。此外,API网关支持插件化,可编写自定义流控插件并动态部署,通过Groovy脚本或表达式定义规则,满足多样流控需求。

良好控制网络拥塞

此外,架构不仅仅关注数据处理和缓存,还考虑到了网络环境的优化。在物理环境中,特别是机房中,网络拥塞可能会影响数据的传输速度和系统的整体性能。该架构通过其设计和实践,有效地管理和减轻了网络拥塞的影响,确保了数据传输的效率和稳定性。
在这里插入图片描述

高度优化和考虑全面的架构设计,旨在提高数据访问速度、处理高并发请求,并确保在网络环境中的稳定性和性能,这个部分会针对于细节放在单独的运维篇去调整和设计说明。

相关文章:

【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现

盘点本年度探索对外服务的百万请求量的API网关设计实现 背景介绍高性能API网关API网关架构优化多级缓存架构设计多级缓存富客户端漏斗模型数据读取架构 异步刷新过期缓存网关异步化调用模型高性能批量API调用(减少对于网关的交互和通信)并行调用和请求合…...

Python算法题集_环形链表

Python算法题集_环形链表 题234:环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例 题234:环形链表 …...

【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…...

#vu3# element plus表格的序号字段

在表格中添加序号字段&#xff0c;可以使用以下几种方式来实现 1. 利用索引 在<el-table>组件的<el-table-column>中使用插槽来显示序号。示例&#xff1a; <el-table :data"tableData"><el-table-column label"序号" type"i…...

华为配置OSPF与BFD联动示例

配置OSPF与BFD联动示例 组网图形 图1 配置OSPF与BFD联动组网图 OSPF与BFD联动简介配置注意事项组网需求配置思路操作步骤配置文件 OSPF与BFD联动简介 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种用于检测转发引擎之间通信故障的检测…...

Git 常用命令详解及如何在IDEA中操作

文章目录 前言发现宝藏一、初识Git1.Git概述2. Git的功能3. Git运行图示 二、Git下载安装三、Git 代码托管服务1.常用的 Git 代码托管服务2.使用码云代码托管服务 四、Git 常用命令1.Git 全局设置2.获取Git 仓库3.工作区、暂存区、版本库 概念4.Git 工作区中文件的两种状态5.本…...

linux+rv1126/imx6ull:opencv静态库交叉编译(手把手百分百成功)

目录 1.下载 2.准备工作 2.1安装依赖环境 2.2安装Cmake 2.3 解压opencv 3.Cmake设置...

Python使用回调函数或async/await关键字、协程实现异步编程

异步编程是一种编程模式,它允许程序在执行某个任务时,能够同时执行其他任务而不需要等待当前任务完成。在传统的同步编程中,程序执行一个任务后必须等待该任务完成后才能继续执行下一个任务。而在异步编程中,程序可以发起一个任务后立即执行其他任务,当原先的任务完成后,…...

异地办公必不可缺的远程控制软件,原理到底是什么?

目录 引言远程桌面连接软件的作用与重要性 基本概念与架构客户端-服务器模型网络通信协议 核心技术组件图形界面捕获与传输输入转发会话管理 性能优化策略带宽优化延迟优化 引言 远程桌面连接软件的作用与重要性 在当今这个高度数字化和网络化的时代&#xff0c;远程桌面连接软…...

docker更换镜像源

添加的镜像源 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn"] }docker更换镜像源之后一定要重启守卫 systemctl daemon-reloaddock…...

SaaS 电商设计 (八) 直接就能用的一套商品池完整的设计方案(建议收藏)

目录 一.前言1.1 在哪些业务场景里使用1.2 一些名词搞懂他1.3 结合业务思考一下-业务or产品的意图 二.方案设计2.1 业务主流程2.2 一步步带你分析B端如何配置2.3 数据流2.3.1 ES 数据表建设2.3.2 核心商品池流程2.3.2.1 商品池B端维护流程2.3.2.2 商品池版本更新逻辑 2.4 核心代…...

【Spring连载】使用Spring Data访问Redis(八)----发布/订阅消息

【Spring连载】使用Spring Data访问Redis&#xff08;八&#xff09;----发布/订阅消息Pub/Sub Messaging 一、发布消息Publishing (Sending Messages)二、订阅消息Subscribing (Receiving Messages)2.1 消息监听容器Message Listener Containers2.2 消息监听适配器The Message…...

list基本使用

list基本使用 构造迭代器容量访问修改 list容器底层是带头双向链表结构&#xff0c;可以在常数范围内在任意位置进行输入和删除&#xff0c;但不支持任意位置的随机访问&#xff08;如不支持[ ]下标访问&#xff09;&#xff0c;下面介绍list容器的基本使用接口。 template <…...

网络原理TCP/IP(5)

文章目录 IP协议IP协议报头地址管理网段划分特殊的IP地址路由选择以太网认识MAC地址对比理解MAC地址和IP地址DNS&#xff08;域名服务器&#xff09; IP协议 IP协议主要完成的工作是两方面&#xff1a; 地址管理&#xff0c;使用一套地址体系&#xff0c;来描述互联网上每个设…...

前端JavaScript篇之JavaScript为什么要进行变量提升,它导致了什么问题?什么是尾调用,使用尾调用有什么好处?

目录 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f;总结 什么是尾调用&#xff0c;使用尾调用有什么好处&#xff1f;总结 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f; 变量提升是JavaScript在代码执行之前对变量和函…...

React和Vue实现路由懒加载

React实现路由懒加载&#xff1a; React官方提供了React.lazy()函数来实现路由的懒加载。使用React.lazy()函数需要配合React的Suspense组件来使用。 首先&#xff0c;使用React.lazy()函数动态导入组件&#xff0c;例如&#xff1a; const Home React.lazy(() > import(…...

ReactNative实现的横向滑动条

OK&#xff0c;我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok&#xff0c;我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from reac…...

华为自动驾驶干不过特斯拉?

文 | AUTO芯球 作者 | 李诞 什么&#xff1f; 华为的智能驾驶方案干不过蔚小理&#xff1f; 特斯拉的智能驾驶[FSD]要甩中国车企几条街&#xff1f; 这华为问界阿维塔刚刚推送“全国都能开”的城区“无图 NCA” 就有黑子来喷了 这是跪久了站不起来了吧 作为玩车14年&…...

docker容器stop流程

从API route开始看StopContainer接口的调用过程。 // NewRouter initializes a new container router func NewRouter(b Backend, decoder httputils.ContainerDecoder) router.Router {r : &containerRouter{backend: b,decoder: decoder,}r.initRoutes()return r } ... …...

生产环境_Spark接收传入的sql并替换sql中的表名与解析_非常NB

背景 开发时遇到一个较为复杂的周期需求&#xff0c;为了适配读取各种数据库中的数据并将数据库数据转换为DataFrame并进行后续的开发分析工作&#xff0c;做了如下代码。 在爷们开发这段生产中的代码&#xff0c;可适配mysql,hive,hbase&#xff0c;gbase等等…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...