作者:王彬、朱磊、史明伟

得益于互联网的发展,知识的传达有了新的载体,运用在线学习渠道的学生规模逐年增加,越来越多学生在线上获取和运用学习资源,其间教育科技企业是比较共同的存在,他们担任的不仅仅是教育者的角色,更是让新技能的创新者和实践者。作为一家在线教育高科技企业,杭州铭师堂建立十余年来一致致力于用“互联网+教育”的科技手段让更多的学生能享有优质的教育,促进他们的全面成长,在不断会聚优质的全国各地教育资源的一同,杭州铭师堂深度聚焦教育功率的提高,深耕先进技能,促进其在校园教育智能化范畴、个性化学习范畴广泛使用。

现在网上教育需求的常态化,教师在线审理作业需求量急剧增大,为了减轻老师的审批工作量,提高教育功率,杭州铭师堂教育根据 Serverless 创造性的开发了学习笔记评优体系, 提高弹性功率,并大幅度下降本钱。

01 峰值流量破万后,如何更好处理使命处理的实时性问题?

杭州铭师堂事务包括全国 20 多个省份,建立十余年来,杭州铭师堂不断会聚优质的全国各地教育资源,并打开先进科学技能在校园教育智能化范畴、个性化学习范畴的使用研究。在教育信息化 2.0 趋势下,公司致力于促进线上教育与线下教育的高度交融,以校园为中心场景,与校园携手共建互联网学习空间,为校园与学生提供学习处理计划,极大促进教育功率的提高。

K8s+ 音讯,体系难以处理数据并行度问题

学生做完作业后,会将作业摄影,然后上传到作业批阅体系,后端体系此刻会有多个动作:

  1. 将作业相片上传到 OSS

  2. 将用户作业信息落到数据库

  3. 发送一条音讯到阿里云音讯行列 Kafka

其间第 3 步发送音讯到阿里云音讯行列 Kafka 后,经过音讯行列 Kafka 的 connector 功能,驱动函数核算(简称 FC) 进行数据处理。函数核算作为事务的核算渠道,承载了一切的处理逻辑,经过图像识别和数据分类算法,自动识别作业的完成状况。

在一年的大多数时刻里,事务流量都比较平稳,但在寒暑假时,一般会迎来一年中的顶峰,在曩昔的 2022 年暑假期间,平均每天需求处理 100 多万的作业图片处理,峰值流量更是达到了万级别。

作业图片的处理程序原先布置在 Kubernetes(简称 K8s),程序经过订阅 Kafka 的 topic,获取数据路径,从 OSS 获取数据进行处理,这一部分涉及到数据并行度的处理,主要存在两方面问题:

  1. Kafka 的消费端并发度受限于 topic 的 partition,消费端个数最多只能跟 partition 数齐平,消费端数量超越 Kafka topic partition 数会导致超越 partition 数目的消费端无法订阅数据,也就没有实践的意义;

  2. 每个消费端消费到数据之后会将数据发到处理线程处理,处理线程在最好的状况下是能够依据事务流量动态调整,当然更多的线程就需求更多的资源,这又涉及到使命资源的水平扩容和笔直扩容问题。实践完成时杭州铭师堂消费端个数与 topic partition 坚持一致,消费线程数经过调优之后坚持了固定数量,在绝大多数时刻里,程序能够很好的满足数据处理的的实时性要求,但关于顶峰期,由于处理才能的约束,仍是会经常呈现使命积压的状况。

为了能够更好的完成使命处理的实时性要求,杭州铭师堂架构组寻求新的架构,经过对云产品的比照之后,最终选择了阿里云函数核算 FC。

02 兼顾弹性和本钱,选定函数核算新计划

经过根据函数核算的新计划,很好的处理了老架构存在的问题,一同,开发迭代速度,运维功率和本钱都得到了很大的优化,新老计划比照如下:

聚焦弹性问题,杭州铭师堂的 Serverless 之路

经过以上比照能够看出,函数核算关于杭州铭师堂学习笔记评优体系仍是十分适宜,在处理弹性痛点的一同,资源本钱,开发运维功率都得到了必定的提高。

03 杭州铭师堂的 Serverless 落地之路

在技能架构的实施过程中,最初也遇到了一点问题:

Java 冷发动的问题:第一个问题是语言的问题,本来的后端程序选用 Java 微服务结构,整个服务中有多个接口,刚开始直接将整个服务布置到函数核算。由于 Java 程序发动的特性,加上整个服务结构加载的模块和数据较多,导致冷发动时刻比较长,触发冷发动时无法很好的满足事务接口呼应要求。

关于这个问题,杭州铭师堂开发同学主要做了两个迭代,首先将代码粒度拆细,在函数核算渠道布置真正的处理代码,第二步,将 Java 语言的代码替换成 TypeScript。替换成 TypeScript 一是由于开发同学比较了解 TypeScript,二是由于 Node.js 发动速度很快。经过这两次迭代,使得函数的弹性功率大大提高,冷发动的状况下也能够达到 50ms 内完成单次恳求。

资源利用率问题:第二个问题是资源的利用率,由于把函数逻辑拆分很细,单个恳求对 CPU 和 Memory 的需求都很小,微了提高利用率,选择敞开函数核算的单实例多并发,经过 PTS 的压测,在并发度和资源上的到了很好的平衡,资源利用率高达 70%+。

超出预期的惊喜:执行时刻快和弹性功率高

经过处理这两个问题,全体开发流程顺利,项目上线后也达到不错的作用,在一些小的方面还有超出预期的体现,主要惊喜来自于执行时刻快和弹性功率高

执行时刻快:在本来服务布置在 K8s 时,事务顶峰期,单个恳求呼应时刻在 100~200ms 左右,放到函数核算后,在顶峰期,恳求处理时刻也能够维持在 50ms 左右,这是大大超出预期的,剖析其间的原因主要是函数核算运转资源比较独立,每个实例处理固定的并发上限,超越部分经过弹出新的实例承载,所以顶峰期恳求脉冲到来时,也不会呈现资源争抢。

弹性功率高:之前在架构设计时,很忧虑函数核算的冷发动问题,由于冷发动涉及到软硬件资源的初始化。但在实践运转体现看,这点忧虑也是能够疏忽的。函数核算后端机器是神龙服务器,单台机器配置很高,单台机器能够切分出许多的运转实例,而且函数核算在镜像拉取,实例热备方面都有优化,运转实例拉起速度十分快,再加上 Node.js 发动速度的优势,在遇到冷发动时,恳求也能够在 100ms 以内呼应,这一点关于实时事务十分友爱。

事务接口上线到函数核算后,很好的处理了之前顶峰期的堆积问题,而且经过函数核算内置的监控和日志服务,在呈现问题时,能够更好的辅佐问题的排查,最重要的一点,经过函数核算的实时弹性,不再需求提早规划资源和布置冗余服务,使得资源本钱也有必定下降。

04 为客户带来更多价值,杭州铭师堂继续探索 Serverless

经过这次项目,函数核算在杭州铭师堂内部的使用得到了更大的推行,将高脉冲和高资源要求的接口剥离出原服务,统一放到函数核算渠道承载,对内部体系完成了一次 Serverless 架构的晋级。

在全体运用过程中,杭州铭师堂架构团队也对函数核算提出了一些缺乏点:

产品集成分裂:在调用链路中,Kafka 数据经过 Kafka connector 触发函数核算的调用,Kafka 触发器与函数核算的运用界面有点分裂,具体体现为 Kafka 侧的订阅消费状况在 Kafka 操控台显现,函数核算的调用和监控需求跳转到函数核算,当呈现问题时,排查问题需求两头操控台跳转,运用体会很不友爱。

布置体系对接不行顺滑:杭州铭师堂经过多年发展,内部有成熟的 CICD 体系,中间参加函数核算之后,需求将函数核算纳入到自有的 CICD 体系中,这方面起初选用函数核算的 Open api,后来经过晋级选用了 Serverless Devs 东西,虽然对接体会有了必定提高,细节方面还需求继续打磨。

未来,杭州铭师堂将与阿里云函数核算团队一道在集成,体会和技能深度等方面持续深耕,一同探索 Serverless 在实践事务的落地,以科技服务教育,用互联网改变教育,让中国人都有好书读。

开始运用函数核算

函数核算是事情驱动的全托管核算服务。运用函数核算,客户无需采购与管理服务器等基础设施,只需编写并上传代码或镜像。函数核算即可准备好核算资源,弹性地、牢靠地运转使命,并提供日志查询、功能监控和报警等功能。

函数核算主要包括服务、函数、运转环境、触发器、层、使用中心等功能组件,具体产品组件架构图如下所示。

聚焦弹性问题,杭州铭师堂的 Serverless 之路

函数核算底层借助阿里云基础设施,如神龙服务器,网络通信,存储,安全组件等,构建安全,牢靠,高功能的服务。弹性伸缩,负载均衡,流量操控,租户阻隔,容灾等才能选用自研体系,确保了函数核算的核算密度,弹性功率,计费精度等中心竞争力。

函数核算的运用流程如下:

聚焦弹性问题,杭州铭师堂的 Serverless 之路

  1. 创立函数,编写代码。

  2. 将第 1 步中编写好的代码以函数的方式布置到函数核算。

  3. 函数核算支撑经过触发器快速构建事情驱动架构事务流程的才能。

  4. 函数核算支撑按恳求付费的模式,在函数有调用时,后端会弹出真实的核算资源,当一同有多个恳求打到函数核算,函数核算会并发的弹出多个核算实例进行并行处理,每个发动核算实例都会坚持必定时刻的在线,超越必定时刻,体系会收回核算实例。

  5. 最终收费时,依照实践函数运转的时刻收费。

经过函数核算的渠道,客户只需求专心事务代码,面向函数极简编程(可选多种编程语言),经过函数核算提供的 SDK,Serverless Devs 东西,丰富的云产品事情驱动触发器,能够快速构建完好的调用链路。开发者不再需求直面 IaaS 资源和容器资源,经过将云上事务拆分到函数级别,多个函数组成服务,多个服务构建使用,让开发者从小处处着手,快速完成事务落地。

全体调用链路如下:

聚焦弹性问题,杭州铭师堂的 Serverless 之路

处理过程细节:

  1. 用户提交作业出发提交流程,将恳求打到后端服务。

  2. 后端服务将用户提交的作业图片上传到 OSS,并将 OSS 地址作为一条音讯发送到 Kafka。

  3. 函数核算的 Kafka 触发器实时的感知 Kafka topic,当有新数据抵达,实时触发函数处理。

  4. 函数核算函数获取到触发恳求中的数据,从 OSS 获取数据,并对数据进行处理,将处理结果发回到 Kafka topic。

  5. 后端程序订阅 Kafka topic,对处理结果进行存储和下一步的展现。

点击此处,直达函数核算!