快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速

news2025/2/27 20:28:12

快手静态部署托管服务(KFX)历经四年发展,经历了三个阶段,一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”,这一转变极大地提升了资源利用率和效率,满足业务的实际需要。本文将带你了解其背后的演进历程。

一、KFX前端通用静态托管服务

KFX是什么:KFX 是快手前端通用静态托管服务。

为什么要有KFX?静态托管服务是前端工程化发展的必然结果。快手前端部署的发展大致经历了这三个阶段:

1.直接在物理机上部署ng服务

2.构建带有ng服务和静态文件的镜像,通过容器上线

3.通过静态托管服务上线 (KFX)

图片

三个阶段分别代表着前端部署虚拟化和静态托管的演化过程,资源利用率和效率都得到极大的提升。有同学看到这就会觉得,怎么能又省资源又提高效率呢,这是不是不符合 space–time tradeoff 啊?实际上是符合的,因为我们有其他的代价:静态托管服务是对前端这种静态资源部署的场景特化支持, 因此牺牲的是灵活性和通用性,即难以扩展到部署的其他场景,但在前端场景,聚焦于静态部署已经足够满足业务前端的部署要求。

简单总结来讲就是,大家不满足于通过容器部署上线web服务,发布的时间实在是太慢了,因此KFX出现来解决了这一问题:一条土路建成了。

二、KFX平台演进过程

初始情况

2022年春,KFX平台基础的静态托管能力已初步建成,支持静态服务路由/版本变更、回滚操作。集群数1个,应用数不到100个。

图片

2.1 崎岖山路

土路,意味着能通车了,但是崎岖不平、问题多多。

面临的问题

土路的最大问题就是土。KFX最初仅支持最核心的静态托管能力,解决大家最痛的效率问题, 把上线时间从容器的分钟级缩短到了秒级,这也是我们最开始的口号。然而崎岖土路的问题可太多了,有时候人家走了一遍,踩到坑里去了,甚至想回去绕远路。具体来说:

问题1:不好走

土路路面不平整,能达到目的地, 但是走起来真的很费劲。服务总会出现奇奇怪怪的问题导致不好用, 能走但是不好走的问题体现在:

  • 业务发布风险高,每次只能全量发布。

  • 分布式集群,通信策略设计有问题,偶发出现版本不一致。

  • 业务总会因为各种各样的原因上线失败。

  • 上线没有审批功能,想什么时候上就什么时候上。

  • 应用无权限隔离控制等

这些问题大多是架构设计不合理、功能不健全导致的,就像是路还没修特别好,就开始通车了,出问题也是在所难免的。

问题2:车道少

土路路面狭窄,难以承载大量或重型车辆,限制了运输效率。KFX 对于多应用,并发大的场景,还没有合适的预案和降级策略。2022年有一次线上压测问题,就是由于高并发下磁盘写入速度瓶颈问题导致的。从来都没有跑过大车,突然就来了装满水泥的混凝土搅拌车,直接就陷在泥里出不来了。

问题3:维护成本高

土路需要频繁的维护和修补,尤其是在恶劣天气后。KFX最初服务稳定性不好,会出现概率性的OOM, 数据库偶发连接失败等问题。为了临时缓解问题,我们甚至有一段时间设置了凌晨四点固定重启服务🥲。 很多用户反馈的问题并不是用户自己操作的问题,而是平台自身的问题。这也就意味着,在用户自身正确操作的情况下,我们还是会有接不完的oncall。

解决方案

这一阶段我们的核心工作是“建”,通过对不合理的架构设计进行重构升级,对缺失的核心能力进行补全。

包括重新设计了心跳检测方案、重构了服务发现机制, 接入公司的星环平台,打通了服务目录和权限控制,同时通过接入流程中心提供了审批能力。其中最重要的是,在pluto灰度服务的加持下,kfx 具备了灰度发布功能,包含白名单、百分比、泳道等各种小流量发布策略,这是历史性的一步,从此大家发布应用不再是一把梭哈了。

实际情况

2022年冬,KFX平台支持灰度发布功能,完成了核心架构的升级。入驻星环平台,作为官方静态部署产品。集群数3个,应用数超过400+,主要覆盖5个部门。

图片

2.2 柏油马路

马路,跑的车越来越多,问题也越来越多。

经过大约一年的建设,我们补全了灰度发布功能,支持了白名单、百分比、泳道等各种小流量发布策略。完成了核心架构的升级,从根源上避免了 版本不一致、服务间接性OOM等问题。土路的不平整基本上被改造完全, 该填平的填平,该硬化的硬化,KFX 进入了柏油马路阶段。

路好了,车就更多了。2023年这一年是KFX规模化扩张最快的一年,也带来了复杂度的快速提升:我们从3个集群,400+个应用,到23年底一共 6 个独立的部署集群,1400+个应用。

面临的问题

规模增长,需求也随之增长, 功能不断增加, 为了满足各种功能的自动化需求,我们先后提供了5 个 流水线 插件,适配了风驰平台(快手前端一站式平台),支持了html能力增强 ,支持了 域名容灾、CDN 域名调度、KConf(快手分布式配置中心) 注入、环境标识等功能。规模增长、功能增加,带来的是架构的复杂度不断增加,以及...更多的线上问题。怎么个多法呢,从23年2月到7月,几乎月均一个线上故障。一个复盘文档没写完,就要赶另外一个复盘文档了。一次故障的改进项没做完,下一次就来了😵‍💫😭。

解决方案:稳

路是修宽了点,车多了,故障也上来了,痛啊,怎么办呢?不要紧,总会有办法的。

这一阶段我们的核心工作是“稳 ”,23年我们启动了 KFX 整体稳定性治理。

(一)KFX 整体稳定性治理

一说到稳定性治理,大家都知道按照事前、事中、事后拆,但是事前事中事后具体要做什么呢?结合KFX当前的实际情况,我们整体的规划从规范、架构、工程化和运维四个维度出发,结合事前、事中、事后拆解如下, 共计 20+ 重要事项:

图片

这里展开讲讲kfx的自动化e2e测试, e2e测试是我们稳定性建设的核心内容,在今天看起来,也是非常有价值的。

(二)KFX 自动化e2e建设

为什么e2e测试对于KFX服务尤其重要?

1、多种使用场景与复杂的用户行为:

KFX发展至今,支持了halo平台,halo流水线、kdev流水线、风驰平台, 多个流水线插件,这些平台和流水线都可以以任何组合方式进行上线部署操作,单个模块或者功能的正确性已经无法保证整体逻辑的正确。一个具体的例子就是 在 2023 H5容灾域名未替换故障里,就是业务方通过 风驰平台上线,发现问题后使用平台(跨入口操作)进行了快速回滚导致的。  

2、回滚链路稳定性差:

在KFX的发布SOP中,我们会将新功能先发布至staging集群,用户在这里发布自己的staging服务(用于业务提测等),大部分功能缺陷支持了halo平台,halo流水线、kdev流水线、风驰平台,多流水线插件,均可任意组合操作。在这个阶段被发现并及时修复,但往往不包括回滚。因为在staging环境下 用户几乎不会使用回滚。但是, 回滚链路不是高频使用链路,但是是核心关键链路,可以说是生命线。用户不用怎么办,我们来找机器人用,因此e2e就是一个很好覆盖核心且低频链路的方案。

3、外部依赖与复杂配置:

KFX 集群有3个独立部署的服务,服务的上下游除了内部之间通过 ksn/内网域名依赖外,还有上游的网关、终端cli、流水线、各平台,下游的 blobstore,数据库,kconf 等, 不同急缺依赖的情况还有各自差异化的地方。单个功能的验证正确,并不代表就不会存在其他的潜在影响。e2e能在prt环境对整体集群进行模拟,尽可能的将问题更早的暴露出来。

综上,建设KFX 的 自动化e2e测试是稳定性治理的必然路径。

整体的e2e测试架构图如下:

图片

这里核心说明三个点:

(一)全量case交叉覆盖:

首先我们枚举了所有用户从所有平台的可能路径,所有的策略类型、变更类型、增强功能。最全的情况是对每一种操作之间进行笛卡尔积,但是这样case的数量将会超过三位数,会导致每次运行的时间过长,因此,我们对case 之间的耦合情况进行划分,相互耦合的case 需要固定出现,而相互独立的case情况则可以作为随机case 出现。

举一个例子:

图片

版本变更和路由变更是会有耦合的,所以版本(不变/增加/回滚) x 路由(不变/新增/删除/编辑) 这12种情况一定需要出现。  然后kconf注入功能和 版本路由变更是相互独立的,所以 版本(不变/增加/回滚)x 路由(不变/新增/删除/编辑) x kconf(注入/不注入)不是 24种情况,而仍然是12种情况, 只需要在前12种情况中,分别一次注入和不注入,剩下的随机即可。按照这个思路优化,我们得出了核心链路P0共68个case。

(二)预发环境混合场景测试

KFX 不是只有一个服务而是多个服务,每次上线的时候 会经历 “新A旧B”的过渡状态,然后才到“新A新B” 的过程, 其中的过渡态也是非常重要的,往往可能会暴露出各种兼容性问题,因此我们在 e2e的链路上也考虑了这种场景,来做混合测试。如下图所示:

图片

(三)复合链路交叉测试

单条链路的稳定并不能保证整个系统的链路稳定,因为应用是有状态的,链路之间是存在耦合的,上面说的H5容灾域名未替换故障里,就是因为 KFC发布 + 平台回滚导致的问题。因此我们做了链路间的交叉测试,比如对于 流水线发布+默认策略+版本变更的case, 跑完后在此基础上执行 平台发布+默认策略+版本回滚,之后可以再随机其他的场景case,通过这样的方式来验证链路间可能的耦合情况。

实际情况

2023年冬,KFX平台做了kfx-api 架构精简化, 建设了自动化e2e、全链路日志、多集群维度监控等核心功能,保障了服务的稳定性。集群数6个,应用数超过1400+,主要覆盖10多个部门。

图片

2.3 高速公路

高速公路比起马路,跑的车又多又快,但是逃不掉的是维护成本

面临的问题

经过一年的稳定性建设,到24年,KFX已经逐步建设成为稳定的公路了,同时朝着高速公路的方向努力。高速公路的特质是高并发、稳定,同时并发量越大,车越多,维护成本就越高,因此有效的控制和降低维护成本也是一个重要的方向。想要建设成为高速公路,做到像高速公路一样又多又稳的跑车,KFX还需要从下面几个方向做能力扩展,总结来看就是以扩为主要方向,以稳和控为约束方向:

【扩】高吞吐量:支持更多的部署场景,支持更大的并发能力。

【稳】稳定性赋能:除了系统本身的稳定性,作为部署域的解决方案,有责任为业务提供稳定性保障。

【控】运维成本降低:在扩张的前提下,维护成本不能线性增加,我们希望整个系统能够稳定又低成本的运行。

解决方案

这一阶段我们的核心工作是 “扩”:扩宽部署域更多的场景,横向上扩宽部署能力,能支持除静态部署之外的应用,在纵向上,扩展支持线下环境部署,建设更快更好用的测试环境部署方案。

多场景建设(扩)

实施背景:

①测试环境标准化部署

KFX的静态部署在线上环境的建设,到今天为止已经相对成熟了。但直接将线上环境的方案迁移到测试环境使用,则还是会出现诸多问题,线上环境第一要素是“稳”,测试环境第一要素是“快”。

  • 测试环境需要支持快速发布、预览、测试, 直接使用线上的流程会让测试环境变得效率不那么高。

  • 测试环境有高频率/高并发/并行的特征。

  • 测试环境会复用代理服务,甚至有直接使用mock代理后端服务的场景,比如白屏检测、性能检测。

②SSR场景、node场景扩展

目前SSR在公司还没有一套完善的配套设施,来提供整个从部署、运行到维护链路的解决方案。通常的方案是直接使用容器云,当作一般的api服务部署,然而api容器部署方案并没有特殊适配SSR的场景,会存在以下问题:

  • 部署成本高:直接使用容器云, 部署、上线、运维成本相对于CSR静态部署陡然提升,

  • 场景功能缺失:灰度,白名单,CDN 降级功能需要单独开发

具体方案:

我们通过 LED 与 KFX 结合,提供了测试环境部署域整体的解决方案:即域名 + 代理 + 路由 + 部署 + 运行环境。

核心功能:

  • 一键部署:结合Gundam 工程生态,触发流水线后能自动分配可访问域名并部署可用环境, 完成创建工程后即可部署一个稳定的测试环境。

  • 配置化生成代理:由于项目的代理是跨分支复用的,因此可以在工程中以配置的方式进行维护,在流水线执行部署时会根据代理配置自动生成相应域名下的代理。

  • 自动化泳道模式:根据插件配置可以切换 主干部署和泳道部署能力, 在泳道模式下,会自动根据分支来设置泳道,同时分配泛域名。此时通过泛域名访问无需注入泳道,方便快速分享。

图片

业务稳定赋能(稳)

实施背景:

KFX 最开始以策略模式作为交互方式,策略模式的功能扩展性更强,能适配更多的场景,但很多的用户都不得不去理解“部署一个默认/灰度策略”是什么意思,为什么一次灰度发布到推全的过程要去上线好几次(发布几个灰度策略,再删除灰度策略,再发布默认策略) 。比起常规的上线单流程,策略模式显得不那么容易理解。

具体方案:

因此,伴随着工程标准化的建设,我们跟商业化一起共建了分级发布的上线模式,并作为标准的能力落地到KFC的插件中。

图片

运维成本降低(控)

智能oncall 接入:

oncall问题一直都是基建工具躲不掉的工作,除了一部分是能从反馈中转化需求做改进之外,更多咨询类的问题只是纯纯的体力工作。

  • 紧跟时代的浪潮,kfx 也拥抱ai 智能oncall。在24年Q3,我们接入了koncall服务,上线了KFX AI小助手,结合kfx的实际情况对AI的回答质量不断优化调整。 

报警治理:

除用户oncall之外,另一个繁重的问题就是报警oncall,我们每天面临着下面诸多的报警。报警治理主要从两个方向出发,首先识别是否是有效报警。

  • 对于有效报警深入分析原因并尽量从根本上解决:

  • mysql连接偶发超时异常,通过数据库从代理改为数据源发现+直连的模式

    • 优化实例退出流程,减少服务请求失败的概率

    • 优化 dns 逻辑,防止 dns 丢包阻塞进程,导致进程 oom

    • 对于无效报警,通过动态调整阈值、调整等级、报警去重等方案转化为有效报警。

    从之前周峰值1000+报警,降低到周均50以内。

    非活跃服务治理:

    kfx服务上托管的应用随着时间在不断增长,过多的应用会拖慢服务的启动速度,因此需要对长期无流量的应用进行识别并下线。

    • 建立 KFX 项目数量管控,常态化项目退出机制

    • 处理下线项目数量 469 个,占直接托管项目数量 51%

    实际情况

    2024年冬,KFX平台支持分级部署,支持 api 代理优先模式。集群数7个,应用数超过6000+,主要覆盖30+个部门。

    图片

    三、总结与反思

    从22年开始,KFX从崎岖土路 一步步走到平坦高速,下面列出了三个阶段的演化。

    图片

    KFX的发展历程总体来看是按照渐进式演进的方式发展,在规模化的现状下秉承着稳定性优先的策略,并结合标准化和自动化,朝着降低运维成本和提高系统维护性和观测性的方向做功。

    展望未来,KFX将继续持续演进,以“扩、稳、控”为核心方向,不断优化架构,提升系统稳定性和运维效率,致力于建设更加智能、高效、稳定的服务平台,打造一条真正的“高速公路”,让业务在更快、更稳、更智能的道路上前行。

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

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

    相关文章

    Locale+Jackson导致Controller接口StackOverflowError异常解决

    问题 由于参与的项目有出海需求,即需要给外国人使用,即:需要支持i18n(Internationalization的缩写,共20个字母,除去首尾两个字母,中间有18个,故简称i18n)。 本来是好的…

    安卓工控平板电脑在环境监测设备中的运用

    安卓工控平板电脑在环境监测设备中的运用主要体现在以下几个方面: 一、耐用性与可靠性 安卓工控平板电脑通常具有坚固耐用的外壳设计,如铝合金面板和镀锌钢板箱体结构,能够抵抗高温、低温、湿度、震动等恶劣的工作环境。这种耐用性和可靠性…

    【洛谷排序算法】P1012拼数-详细讲解

    洛谷 P1012 拼数这道题本身并非单纯考察某种经典排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)的实现,而是在排序的基础上,自定义了排序的比较规则,属于自定义排序类型的题目。不过它借助了标准库中…

    文心一言AI创意画

    介绍 文心一言是百度推出的新一代知识增强大语言模型,属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作,高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习,采用预训…

    java项目之基于ssm的图书馆书库管理系统(源码+文档)

    风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的图书馆书库管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 该系统可以实现图书信息管理…

    使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注

    在计算机视觉中,帧间差异检测(frame differencing)是一种常用的技术,用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中,我们将通过分析一个基于OpenCV的简单帧间差异…

    deepseek从入门到精通-第一篇.本地化部署

    前言 自从22年年底开始,人工智能开始从实验室一下子走入了普通人的视野中,chatgpt像一颗石子投入水中,溅起了一波又一波的涟漪。我们都通过各种方式试用大预言模型和机器进行对话或者提问。随着大语言模型的出现,各个类型的大模型…

    2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码

    一. 真菌生长优化算法(FGO) 真菌生长优化算法(Fungal Growth Optimizer,FGO)是一种新型的自然启发式元启发式算法,其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…

    Ubutu部署WordPress

    前言 什么是word press WordPress是一种使用PHP语言开发的建站系统,用户可以在支持PHP和MySQL数据库的服务器上架设WordPress。它是一个开源的内容管理系统(CMS),允许用户构建动态网站和博客。现在的WordPress已经强大到几乎可以…

    BIO、NIO、AIO解析

    一、基础概念 1、IO的含义 IO,Input/Output,即输入/输出。从计算机结构来看,IO描述了计算机系统和外部设备之间通讯的过程。从应用程序角度来看,一个进程的地址空间划分为 用户空间(User space) 和 内核空…

    【Python网络爬虫笔记】14-使用代理绕过访问限制

    【Python网络爬虫笔记】14-网络代理 目录什么是代理?为什么需要使用代理?代理的类型如何在Python中使用代理?使用requests库设置代理使用urllib库设置代理使用scrapy框架设置代理 典型案例:使用代理爬取豆瓣电影Top250步骤1&#…

    Linux中Shell运行原理和权限(下)(4)

    文章目录 前言一、Shell的运行原理二、Linux当中的权限问题Linux权限的概念如何将普通用户添加到信任列表 三、Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法文件访问权限的相关设置方法如…

    OceanBase数据库实战:Windows Docker部署与DBeaver无缝对接

    一、前言 OceanBase 是一款高性能、高可扩展的分布式数据库,适用于大规模数据处理和企业级应用。 随着大数据和云计算的普及,OceanBase 在企业数字化转型中扮演着重要角色。学习 OceanBase 可以帮助开发者掌握先进的分布式数据库技术,提升数…

    技术速递|.NET 9 网络优化

    作者:Mňa,Natalia,Anton 排版:Alan Wang 秉承我们的传统,我们很高兴与您分享这篇博客文章,以介绍新的 .NET 版本中网络领域相关的最新动态和最有趣的变化。今年,我们带来了 HTTP 领域的改变、新…

    Tag标签的使用

    一个非常适合运用在vue项目中的组件:Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网,搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组,…

    Linux:(3)

    一:Linux和Linux互传(压缩包) scp:Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是…

    HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索

    【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…

    计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)

    图像预处理是计算机视觉任务中的关键步骤,它通过对原始图像进行处理,以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像预处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.spli…

    采用DDNS-GO与cloudflare实现双域名同时访问NAS

    这个标题其实解释的还不够清楚,本人是小白,但是买了群晖的NAS后自己瞎折腾了一下,遇到了如下的问题: 1、家里是移动宽带,没有公网IP,因此Ipv4无法使用,IPV6可以正常使用。 2、办公室场地采用的…

    w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

    概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板,支持IEEE802.11 b/g/n Wi-Fi,以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器,主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装,PCB板载天线,…