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

news2024/10/5 17:29:54

盘点本年度探索对外服务的百万请求量的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脚本或表达式定义规则,满足多样流控需求。

良好控制网络拥塞

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用PHPStudy搭建本地web网站并实现任意浏览器公网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

跟着pink老师前端入门教程-day18

3、CSS3 3D转换 生活中的环境是3D的,照片就是3D物体在2D平面呈现的例子 特点:近大远小,物体后面遮挡不可见 3.1 三维坐标系 三维坐标系其实就是指立体空间,立体空间是由3个轴共同组成的 x轴:水平向右 注意&#x…

【字符串】字典树

字典树就是利用一个这样的树状结构&#xff0c;可以记录字符串有没有出现过 放个板子 int nxt[100000][26], cnt; bool st[100000]; // 该结点结尾的字符串是否存在 void insert(string s, int l) // 插入字符串&#xff0c;l是字符串长度 { int p 0;for (int i 0; i < …

QT Linux下无法使用CTRL+ALT+P快捷键,不生效

文章目录 一、背景二、排查&#xff08;1&#xff09;检查创建&#xff0c;发现没问题。&#xff08;2&#xff09;查看 shortcutMap 是否注册&#xff08;3&#xff09;排查xcb有没有获取到该事件&#xff08;4&#xff09;排查是否是系统的问题&#xff08;5&#xff09;www.…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

JS第一天、数据类型检测、内存释放

复习&#xff1a; 以下类型都是 object console.log(typeof new Object); console.log(typeof new Array()); console.log(typeof new Date()); console.log(typeof new RegExp()); console.log(typeof new String()); console.log(typeof new Number()); console.log(typeof…

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…

跨越视觉-语言界限:BLIP的多任务精细处理策略

BLIP 核心思想MED架构和CapFilt方法效果 总结CLIP模型 VS BLIP模型CLIP模型BLIP模型 核心思想 论文&#xff1a;https://proceedings.mlr.press/v162/li22n/li22n.pdf 代码&#xff1a;https://github.com/salesforce/BLIP BLIP&#xff08;Bootstrapping Language-Image Pre…

重生奇迹MU如何挂机

1、重生奇迹MU觉醒哪里挂机经验多挂机收益最大化&#xff0c;在重生奇迹MU中玩家可以通过副本获得大量的经验和金币&#xff0c;甚至挂机也有不错的收益&#xff0c;对于玩家来说 2、卡利玛神庙、血色城堡、迷失之城、恶魔广场甚至是挂机自动刷怪&#xff0c;组队都会有经验加…

linux安装naocs

一.安装jdk 二.安装nacos 1.下载nacos Releases alibaba/nacos GitHub 2.上传到服务器 3.解压nacos tar -zxvf nacos-server-2.3.0.tar.gz 会生成一个nacos文件夹 4.启动nacos 进入nacos/bin目录 cd nacos/bin 启动 ./startup.sh -m standalone 5.访问 http://…

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…

HarmonyOS远程真机调试方法

生成密钥库文件 打开DevEco Studio&#xff0c;点击菜单栏上的build&#xff0c; 填一些信息点击&#xff0c;没有key的话点击new一个新的key。 生成profile文件 AppGallery Connect (huawei.com) 进入该链接网站&#xff0c;点击用户与访问将刚生成的csr证书提交上去其中需…

每日学习笔记R2

【欧洲开发水面无人作战平台】 欧洲10个国家的23个企业联合开展“欧洲卫士”项目&#xff0c;目的是为欧洲多国海军开发一款配备远程控制系统的模块化水面无人作战潜艇。||项目成立的目的 该项目旨在通过提升作战平台和武器系统的先进化水平&#xff0c;满足欧盟各国海军日益…

DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

上一课时介绍了通过搭建一套部署流水线&#xff0c;高效、可靠的将软件部署到测试环境以及生产环境。到目前为止&#xff0c;我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展&#xff0c;近几年&#xff0c;出现了一种新的实践&#xff0c;…

【240113】东北石油大学—调剂信息

东北石油大学 学校层级&#xff1a;双非 调剂专业&#xff1a;0857专业&#xff08;接收0854专业考生&#xff09; 发布时间&#xff1a;2024.1.13 发布来源&#xff1a;网络发布 背景&#xff1a;学习地点: 黑龙江省大庆市 (地处东北&#xff0c;冬季寒冷&#xff0c;需提…

springAop讲解

写在前面 本文旨在帮助入门和了解aop的概念以及基本用法&#xff0c;如有错误请在评论区指出&#xff0c;万分感谢。 部分资料出自尚硅谷课堂笔记,改内容更好&#xff0c;更完善。依赖准备 使用aop编程的话&#xff0c;我们需要先导入需要的依赖 spring-context: 包含Spring…

随记-Java项目处理SQL注入问题

现象&#xff1a;http://10.xx.xx.xx:xx/services/xxService 存在SQL注入情况 加固意见&#xff1a; 需要对网站所有参数中提交的数据进行过滤&#xff0c;禁止输入“"、"xor"、"or"、”--“、”#“、”select“、”and“等特殊字符&#xff1b;所有…

【LongChain-03】在本地运行LLM的另一些案例

​ 一、使用案例说明 PrivateGPT、 llama.cpp和 GPT4All等项目的流行 强调了在本地&#xff08;在您自己的设备上&#xff09;运行 LLM 的需求。 这至少有两个重要的好处&#xff1a; Privacy&#xff1a;您的数据不会发送给第三方&#xff0c;并且不受商业服务的服务条款的约…

复旦大学NLP团队发布86页大模型Agent综述

复旦大学自然语言处理团队&#xff08;FudanNLP&#xff09;发布了一篇长达86页的综述论文&#xff0c;探讨了基于大型语言模型的智能代理的现状和未来。该论文从AI Agent的历史出发&#xff0c;全面梳理了基于大型语言模型的智能代理现状&#xff0c;包括LLM-based Agent的背景…

Linux系统安全①iptables防火墙

目录 一.iptables防火墙概述 1.netfilter与iptables &#xff08;1&#xff09;netfilter &#xff08;2&#xff09;iptables 2.iptables防火墙默认规则表、链结构 二.iptables四表五链 1.四表 2.五链 3.总结 三.iptables的配置 1.安装 2.配置方法 &#xff08;1…