简介:随着核桃编程业务的快速增长,核心应用的系统规模和系统复杂度也在发生着翻天覆地的变化。核桃技术团队通过不断涌现的技术手段,持续保持整个系统架构的技术进步。近3年技术团队至少对系统整体架构进行了6次重大重构,涉及微服务、容器化、分布式数据库等重要技术,并尝试通过Serverless提高系统的弹性扩展能力技术。疫情期间,在系统负载骤增数倍的情况下,核桃编程的系统架构依然经受住了考验。作者|山魂根据《中国少儿编程行业研究报告》和《2017-2023 年中国少儿编程市场分析预测研究报告》的预测,少儿节目有望在3-5年内达到少儿英语市场规模的一半,即500亿左右,发展前景可期广阔。在当今信息时代,人工智能给人们带来了巨大的变化。新时代的父母处于互联网时代,他们的思维方式与上一代相比发生了重大变化。他们可以关注孩子的素质教育和孩子人工智能的培养。定向人才。正是在这样的背景下,少儿编程教育得到快速发展。核桃编程是少儿编程教育行业的领跑者。致力于通过科技手段推动编程教育,通过人工智能、适应性学习等先进技术和科学的教育方式激发中国孩子的学习能力。核桃编程自2017年8月成立以来,业务量快速增长。短短三年时间,付费学员人数突破200万,月收入突破1亿。随着核桃编程业务的快速增长,核心应用的系统规模和系统复杂度也在发生着翻天覆地的变化。核桃技术团队通过不断涌现的技术手段,持续保持整个系统架构的技术进步。近3年技术团队至少对系统整体架构进行了6次重大重构,涉及微服务、容器化、分布式数据库等重要技术,并尝试通过Serverless提高系统的弹性扩展能力技术。疫情期间,在系统负载骤增数倍的情况下,核桃编程的系统架构依然经受住了考验。随着系统架构从简单到复杂的变化,互联网领域一个长期存在的问题逐渐体现在核桃编程中:如何提高分布式系统的可观察性?在在线编程教学场景中,一次简单的用户操作可能会涉及到前后端系统的多次交互,以及多个服务端微服务应用之间的相互调用,甚至可能受到第三方服务的影响接口。.任何一个环节出现故障或性能瓶颈,都会导致用户体验断崖式下滑,而用户体验是决定品牌形象的核心要素。因此,对于核桃技术团队来说,保证优秀的用户体验需要系统可观测性的建设来实现以下几个方面:全面、实时地了解系统各个对外接口的性能质量。使用数据来了解最终用户在与系统交互时所感知的系统健康状况。当系统健康出现问题时,技术团队可以第一时间发现问题并及时处理。在处理问题时,可以快速定位系统瓶颈和故障源。围绕这些方面从零开始构建分布式可观测系统,对于任何一个技术团队来说都是一项非常艰巨的任务。幸运的是,业界已经有很多分布式可观察性的成熟方法论和开源项目可以参考。业界公认的Observability包括三个核心要素:Logging(离散的日志信息)、Metrics(聚合指标)、DistributedTracing(分布式追踪)。围绕这三个核心要素,有很多开源项目可以选择,帮助开发者快速搭建分布式可观察系统。核桃技术团队通过引入Skywalking、Prometheus等开源技术,建立了完整的分布式可观测系统,可以在服务端实现对复杂微服务应用的全链路跟踪,通过统一的数据采集和分析业务日志。日志服务系统。这样的努力将立即提升系统稳定性和用户体验:当系统服务器的任何部分发生故障或出现性能瓶颈时,将立即通知技术团队,并可以快速定位问题并进行针对性处理。与成熟的服务端监控技术相比,整个行业一直缺乏客户端监控领域的技术解决方案。在互联网上,大量用户使用不同厂商、不同操作系统、不同屏幕分辨率的终端设备,分布在不同的地区,通过不同的网络运营商接入,甚至存在复杂的第三方依赖,包括CDN、第三方统计脚本、页面嵌套等。当用户体验遇到问题时,如果只有服务端的监控手段,很难确认问题的根源是在前端还是在后台。首先结束。即使可以排除服务器端的问题,前端的用户体验也会受到页面渲染、JavaScript执行、网络质量、第三方接口服务质量等方面的影响,给进一步排查留下不少挑战。一个简单的思路就是用前端JavaScript做自定义埋点,将终端用户的各种行为实时上报给服务器进行统计,第一时间了解用户体验。这个想法本身是有道理的,但是在业务埋点、数据采集、聚合分析、视图呈现等方面需要做很多工作,是一个浩大的工程。对于绝大多数技术团队来说,投入如此多的精力来构建这样的前端监控方案是不现实的。构建前端可观察系统的最佳捷径是参考互联网领域领先公司的案例,选择云计算厂商提供的完整解决方案。多年来,阿里巴巴积累了一套全集团统一的前端监控解决方案,开放给各事业部接入。对于以HTML页面形式呈现的前端应用,无论是PC端/手机端的网站,还是手机端App内嵌的HTML5页面,都可以接入本前端监控解决方案一种非侵入性的方式。这套监控方案也同时通过阿里云输出,成为阿里云整体可观测性解决方案的重要组成部分,服务于大量外部用户。在客户端监控领域,包括ARMS前端监控和APP监控。其中,ARMS前端监控侧重于web端体验数据监控,从页面打开速度、页面稳定性、外部服务调用成功率三个方面对网页进行监控。页面健康帮助用户减少页面加载时间,减少JS错误,有效提升用户体验。该方案恰好弥补了Walnut编程在客户端监控领域的不足,因此Walnut技术团队在部分业务线尝试对接阿里云ARMS前端监控。很快,他们就感受到了这个解决方案在提升用户体验方面的价值。ARMS前端监控方案之所以能够被核桃编程采纳,一个很重要的原因就是方案的接入非常简单。唯一要做的就是将ARMS提供的部分添加到客户端HTML页面的Body元素中。统计访问脚本(一段JavaScript代码)可以完成监控数据的自动上报。这不涉及与业务层的任何主动埋点工作,核桃编程在多个业务线之间的推广非常顺畅。根据以往的经验,任何需要主动嵌入业务层的监控方案,都需要通过行政手段来保证多个研发团队在编写代码时遵守既定规则。这种方法从长远来看是很难实施的。包括在服务端全链路监控方面,核桃编程始终遵循非侵入式业务的思路,避免主动埋点行为。接下来,开发者可以从前端监控控制台全面了解应用端到端的健康状况,包括PV/UV统计、页面加载速度、JavaScript执行、API请求成功率等诸多方面。以页面加载速度为例,ARMS可以根据客户端自动上报的监控数据,实时显示各个页面的加载情况。其中,首次渲染时间、首次屏幕时间、DomReady等指标都是HTML页面特有的性能指标,遵循业务标准的指标定义。这些指标数据与前端页面的健康状况息息相关,影响着终端用户每一次交互行为的实际体验。通过页面加载瀑布图,可以按照页面加载的先后顺序直观展示各个阶段的耗时。这些指标参数涵盖了网络层面的性能指标。当网络层面出现性能瓶颈时,如应用系统的访问带宽无法支撑用户访问流量时,仅通过服务器端的监控手段是无法检测到的,必须依赖于客户。终端实时监控数据上报。通过ARMS前端监控,核桃编程可以从页面生产(服务器端状态)、页面加载、页面运行时三个方面全面了解各个应用系统端到端的健康状况。尤为重要的是,ARMS前端监控可以从地理位置、浏览器、操作系统、分辨率、网络运营商、应用版本等方面对性能指标进行聚合分析,从而帮助核桃编程更好地定位性能瓶颈。JavaScript错误分析和API请求分析也是核桃编程在应用系统日常维护中非常关注的页面健康指标。前者可以显示JavaScript错误的基本信息和分布,具有用户行为追溯能力。后者可以展示各个API的调用状态,包括调用成功率、返回信息、调用成功或失败的平均耗时等。当前端页面加载满后,用户的操作会涉及到复杂的JavaScript执行和在页面触发多个API调用,包括调用第三方提供的接口。ARMS能够真实地从终端用户的角度还原前端代码执行的完整场景,帮助核桃编程从前端快速定位故障源。和页面加载速度统计一样,JavaScript错误分析和API请求分析可以通过地理位置、浏览器等多个维度进行聚合分析。在在线编程教育的业务场景中,客户端的实现包括大量的业务逻辑和云端之间的双向交互。有些问题只能在特定的浏览器和页面分辨率下暴露。这类问题尤其依赖多维聚合分析排查。在掌握了ARMS提供的前端可观察能力后,核桃编程开始将前端页面健康指标作为日常业务迭代的检测标准。本次工作配合各业务线灰度发布计划进行。对于生产环境的每次版本升级,核桃编程都会通过灰度发布的方式来实现。首先,新版本会引入小规模用户流量,进行功能、稳定性和健康验证。只有达到预定指标后,才会逐步增加导入新版本的用户流量,否则会立即回滚版本。前端健康的各种指标是非常重要的衡量维度,而这些指标在版本发布前仅仅通过常规的测试手段是无法完全收集到的。核桃编程将前端健康纳入业务迭代的衡量标准,体现业务迭代过程中的灰度、可观察性和回滚性。这也是阿里巴巴内部广为推崇的安全生产三原则。除了通过ARMS控制台主动观察和分析前端各项业务指标外,更重要的是遇到用户体验问题如何第一时间得到通知和告警,做到防患于未然。这种诉求可以通过ARMS完善的告警机制轻松实现。核桃基于自身对前端健康的理解和业界通用的方法论,打造了多维度的告警规则,比如“最近5分钟内第一次页面平均渲染时间大于1秒”等在。当触发规则时,系统会以预先指定的报警方式向报警联系人组发送报警信息,提醒技术团队及时解决。这些告警规则,结合生产故障的分级分类定义,可以帮助核桃技术团队建立一套完整的生产故障响应机制,真正实现问题5分钟上线、10分钟内隔离、问题内解决30分钟。核桃编程也在积极探索前后端统一链路跟踪技术,将前端的API请求串联到后端调用,真正还原代码执行的完整场景。这是通过在前端API请求中自动注入Trace信息来实现的。ARMS前端监控可以在允许API自动上报的前提下,将自动生成的TraceID添加到API请求的RequestHeader中,作为前后端串联环节的标识。这样通过调用的时间轴就可以知道是网络传输还是后端调用导致请求耗时过长。更进一步,通过后端应用的线程分析功能,可以洞察到每个请求后端完整的调用链路,有助于排查系统故障。而性能瓶颈带来了很大的帮助。完善的前端可观察性体系,不仅帮助核桃编程降低运维工作量30%以上,故障定位平均耗时缩短60%以上,极大提升用户体验,奠定了良好的基础。为企业的可持续发展奠定了坚实的基础。坚实的基础。核桃技术团队将根据自身技术特点,不断探索更多前沿的云原生技术,充分享受云计算带来的红利。版权声明:本文内容由阿里云实名注册用户投稿,版权归原作者所有。阿里云开发者社区不拥有自己的版权,也不承担相应的法律责任。具体规则请参考《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如发现本社区涉嫌抄袭内容,请填写侵权投诉表进行举报,一经查实,本社区将立即删除涉嫌侵权内容。
