作者:腾讯在线教育技术团队 导语| 腾讯在线教育部后台中心团队,作为在线教育行业的从业者,尝试整理一下2020年后端技术要点,以此窥探后台未来技术的发展趋势: ①云计算进程提速,一切皆服务。 ②云上安全越来越受到企业的重视。 ③从资源云向业务云化转变,最终全面云原生化。 ④微服务、DDD、中台技术并非企业技术架构设计的银弹。 ⑤Python、Go、Rust成为后端未来最先考虑学习编程语言。 ⑥Go语言生态发展稳健,越来越多企业在生产中使用Go语言落地业务。 ⑦疫情催化在线教育行业产品升级转型,音视频技术不断迭代升级。
上篇已对前四个趋势进行了展开介绍,本文将详细阐述后三个。
点击查看上篇:2021下半年有哪些不能错过的技术趋势?(上)
DevOps
2020 年,在云原生的浪潮下,devops 相关的技术栈也在稳步地向前演进,下面将从以下几个方面分别进行阐述:
业内趋势
当前出现了一系列的基于Kubernetes的CI/CD工具,如Jenkins-x、Gitkube,它提供了从代码提交、自动编译、打包镜像、配置注入、发布部署到Kubernetes平台的一系列自动化流程。甚至出现了像ballerina这样的云原生编程语言,它的出现就是为了解决应用开发到服务集成之间的鸿沟。然后结合监控告警系统实时掌握服务运行情况,结合调用链系统进行服务故障定位。
在线教育的实践
蓝盾是腾讯从业务安全出发,贯穿产品研发、测试和运营的全生命周期;助力业务平滑过渡到敏捷研发模式,打造的一站式研发运维体系。它助力业务持续快速交付高质量的产品。蓝盾提供了丰富的特性:
监控系统事实上的标准 prometheus
Prometheus 在度量领域的统治力虽然还暂时不如日志领域中 Elastic Stack 的统治地位那么稳固,但在云原生时代里,基本也已经能算是事实标准了。2020 年,对 prometheus 来说,是忙碌的一年:
grafana cloud agent 发布:为 grafana cloud 优化的的一个轻量级 prometheus 分支,它使用 prometheus 的代码,保证 prometheus 生态依赖的一些属性:数据完整性、数据过期处理等等。允许使用一种更灵活的方式定义从何处以什么方法拉取和传输数据,它已经成为一种更受欢迎的方式将数据写入后端存储。它的 remote_write 方式相比于传统 prometheus agent 的 remote_write,内存使用降低了 40%;
v2.19.0 的发布:最核心的功能是,对于完整的 chunk,在内存中使用 head 结构映射磁盘中的 block,单就这一个点,内存使用就降低了 20%-40%,并且使得 prometheus 的重启速度更快;
v2.20.0 的发布:它为 Docker Swarm 和 DigitalOcean 支持了本地的服务发现;
提升批量插入一大批老数据到 prometheus 的效率;
Grafana Metrics Enterprise 的启动:提供针对大企业的 prometheus-as-a-service 的解决方案
在线教育的实践
nginx 访问日志和服务间模块调用相关信息都上报到全链路 es 集群
通过一个 exporter 对 es 中的数据按照项目和接口维度进行汇聚,将相关的聚合数据存入 prometheus
全链路 es 和 prometheus 都可以作为 grafana 的数据源进行数据展示和告警判断
alert 模块将告警信息发送到相应的渠道
收到告警之后,去 grafana 查看对应时间段的趋势图,去全链路 es 集群查看对应时间段的原始日志
比起日志与度量, tracing 这个领域的产品竞争要相对激烈得多。一方面,目前还没有像日志、度量那样出现具有明显统治力的产品。另一方面,几乎市面上所有的追踪系统都是以 Dapper 的论文为原型发展出来的,功能上并没有太本质的差距,却又受制于实现细节,彼此互斥,很难搭配工作。
OpenTracing 规范
为了推进追踪领域的产品的标准化,2016年11月,CNCF技术委员会接受了OpenTracing作为基金会第三个项目。OpenTracing是一套与平台无关、与厂商无关、与语言无关的追踪协议规范。
OpenCensus 规范
OpenTracing规范公布后,几乎所有业界有名的追踪系统,譬如Zipkin、Jaeger、SkyWalking等都很快宣布支持OpenTracing,但是Google自己却在此时提出了与OpenTracing目标类似的OpenCensus规范。OpenCensus不仅涉及到追踪,还把指标度量也纳入进来。
OpenTelemetry 规范
2019年,OpenTracing和OpenCensus又共同发布了可观测性的终极解决方案 OpenTelemetry,并宣布会各自冻结OpenTracing和OpenCensus的发展。OpenTelemetry野心颇大,不仅包括追踪规范,还包括日志和度量方面的规范、各种语言的SDK、以及采集系统的参考实现。
在线教育的实践
腾讯基于 OpenTelemetry 规范,自研了天机阁系统。天机阁主要分为三大部分:
与之对应提供七大能力:
系统架构图
功能模块图
serverless 对提升 devops 的展望
service mesh 对提升 devops 的展望
音视频
1. 音视频技术回顾
随着AI技术的兴起、5G时代的到来,音视频技术不断加速应用发展,像直播、短视频这样的产品遍地开花,火热程度相信大家或多或少都接触过。
音视频技术的加速应用依赖底层编解码标准的发展,当前主流的 H.264 编解码技术已经不能满足未来4K、8K的需求,今年年中刚发布的H266/VCC,与 H.265相比进一步提高了压缩效率,这项耗时3年的标准,主要面向未来的4K和8K,后续的落地应用非常值得期待。
在实时音视频技术领域,不得不提及谷歌的开源项目WebRTC,可以在浏览器上快速开发出各种音视频应用,目前主流的浏览器包括Chrome、Firefox、Safari等都将WebRTC作为首选的实时音视频方案。同时也催生了像声网、即构科技这样的专门音视频服务商。从StackOverflow Trends 和GoogleTrends来看,未来关注度仍会持续上升,腾讯也是WebRTC应用的主力军。
目前直播后台开发主要分为三大块:
随着网络技术的不断发展,持续提供高质量的视频信号传播已经算不上浪费网络资源,即使一个直播无人观看,未来慢直播具有极大的延伸价值以及发展前景,让我们期待慢直播行业的蓬勃发展。
借助5G技术低时延、高速率、大容量等显著优势,音视频的大赛道,从目前的短视频慢慢走向中长视频发展,这是未来的大风口。
目前腾讯在线教育音视频直播已完成整体上云,腾讯云的互动直播也从早期的opensdk全面升级到TRTC,TRTC是腾讯实时音视频[Tencent Real-Time Communication],源自QQ音视频团队,是基于QQ十几年来的音视频技术积累。
腾讯云提供TRTC(全球延时<300ms)+WebRTC快直播(上行走RTMP推流或FLV、HLS、RTMP回源,下行支持标准WebRTC协议输出,延时500ms左右)+标准LVB直播(FLV/HLS/DASH,平均延时3-5秒)融合解决方案,如下图中用户可以针对自己的业务场景组合不同的直播解决方案。承载大规模带宽、支撑高并发,保证客户业务正常运作,达到99.9%以上的可用性,整体资源储备及业务突发承接能力行业领先。
随着全民抗疫,“停课不停学”的号召,在线教育也成为直播的主力军,直播的进房成功率/首帧延迟/卡顿率/音画同步时延/分辨率等指标直接影响用户核心体验。站在云的肩膀上,在线教育直播业务通过组合云上多种直播模式,结合业务流控系统,对各端直播接入进行多级流控及直播模式切换,在保证直播质量的前提下支撑远超互动直播极限的房间容量,下图是具体的直播架构。
目前直播课普遍采用大班授课方式,老师在上课的时候,跟学生的互动有限,学生的注意力和参与感有限。大班教室人数太多,老师无法提供足量的presentation机会,学生与学生之间缺少有效的学习互动。
腾讯在线教育部推出如下图的六人小班课,基于TRTC 在互动课堂场景下,为学员提供了稳定优质的服务,延迟低至原来的1/10,互动效果得到很大提升。六人小班课给用户带来更多“被关注”的感觉,相比于大班课,家长的价值感知更高。
接入网关
1. 网关发展历程
接入网关有四大职能
开源网关发展迅速。从nginx横空出世,到openresty解放程序员,更加专注解决业务需求,再到kong成为api网关的独角兽,以及最近出现不久的apisix,当然也不能少了大名鼎鼎的envoy。下面介绍主要的几个网关。
nginx
2004年10月4日发布的第一个公开版本以来,nginx已成为高性能web服务器、反向代理服务器的代名词。相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,能够支持高达 50,000 个并发连接数的响应。模块化和将一个请求分为多个阶段的设计,方便开发人员扩展。
openresty
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。python、js、lua 三种语言中,lua 是解析器最小、性能最高的语言,而LuaJIT比lua又快数10倍,开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
kong
kong 是 API 管理的强大效率工具,主要有4个特点
在线教育网关发展过程中的包袱
tiny网关
tiny网关主要的能力如下:
完整的架构如下图所示
go语言
随着云原生在互联网行业的普及,golang从众多语言中,脱颖而出,成为了云原生时代的新秀。越来越多的开源项目采用golang语言来实现。因此学习和掌握golang语言,越来越成为一种趋势。本篇文章,主要围绕golang语言的主要特性来展开讲解,希望对大家有帮助。
语法简单
golang素以简单著称,总共25个保留字,相比c++的82个,java语言的50个,少的不能再少了。golang官方也比较吝于新增命令字。常见的结构和判断,对于golang来说,就只有if,for,switch等非常简单的命令字。自带的array,slice,map等数据结构,基本可以cover大多数的使用场景。
部署方便
编译好的golang程序,是一个独立的二进制程序,只依赖操作系统的一些基础库,除此之外,没有任何其他外部依赖。有使用过golang语言开发开源软件的同学,应该感触。
静态编译
golang是一门静态强类型的编译型语言,与c++类似,golang也是也有一个完整的编译链接过程,并且有严格的编译期的语法检查过程。配合golang强大的工具链,在编译期可以提前解决脚本语言运行时才能发现的诸多问题。
垃圾回收
一直以来,c++程序员饱受内存问题的困扰,常见的比如内存泄漏,溢出,double free等问题层出不穷,并且定位起来费时费力。c++官方为了降低使用成本,也在c++0x之后,引入了智能指针来解决内存使用的问题。但是内存问题依然存在。golang跟java语言一样,从语言层面提供了GC能力,自带的垃圾回收机制,有效解决了内存使用的诸多问题。但是垃圾回收并非完美无缺, 不合理的内存使用方式,依然会导致程序出现严重的gc问题,从而导致程序出现性能问题,因此也有一定的trick需要遵循。
工具链支持
除了golang语言自带的编译,安装,单元测试等工具之外,c++的调试神器gdb也能够使用。同时第三方提供的delve调试工具, 兼容性和易用性更好,同时还提供了远程调试的能力。原生自带的perf工具,配合第三方的go-torch工具,生成的火焰图,调试的时候非常方便, 让性能瓶颈能够一目了然。
泛型
golang被人诟病的特性之一,就是不支持泛型。官方认为虽然泛型很赞,但会使语言设计复杂度提升,所以并没有把这个泛型支持作为紧急需要增加的特性,也许在不久的将来, 会引入这个特性。现阶段可以通过使用Interface作为中间层,起到抽象和适配的作用。一些第三方工具,比如genny,通过模板化生成代码,也可以作为泛型的一种解决方案。
错误处理
golang语言, 错误处理从语言层面得到了支持, 基于Error接口来实现,配合函数的多返回值机制,, ,一般情况下, 错误码也会作为函数的最后一个返回值。在golang中, 错误处理非常重要, 语言的设计和规范,也鼓励开发人员显示的检查错误。也正因为如此,golang的错误处理,也被很多人所诟病,觉得不像其他高级语言,比如java的错误处理那么简洁。不过整体来说,golang作者将错误码显性化,目的是为了让大家能够重视错误处理,所以应该说是各有特色。
包管理
golang语言刚诞生的时候,并不支持版本管理。GOPATH方式,也只能算是包管理基本的雏形。后来经过一系列的演变,社区先后支持了dodep,glide的工具。直到2016年,官方才提出采用外部依赖包的方式,引入了vendor机制。2017的时候推出的dep工具,基本可以作为准官方的解决方案了。然而,直到2019,go modules的推出, golang的包管理争论才最终尘埃落定。基于go mod的版本管理机制,基本上可以说是一统江湖。具体的golang包管理演进过程,如下图所示:
并发性能
golang从语言层面就支持了并发,大大简化了并发程序的编写。这也是golang广受大家欢迎的原因之一。goroutine是golang并发设计的核心, 本质上讲就是协程,也叫做用户态线程,它比线程更易用,更高效,更轻便,占用内存更小,并对开发者屏蔽了底层的协程调度细节。提供的go,select,channel等关键字,易用性非常好。配合golang中提供的sync包,可以非常高效的实现并发控制能力。
常见网站
生态
Go在未来企业会有更多布道:Go Conference一直都是Gopher关注的技术大会,20年11月国内的Go Conferernce分享主题主要包括Go语言基础(Go编程模式、Go Module、Go编译器、组件包)和架构落地实践(微服务实践、微服务框架、云原生实践、大数据和高并发挑战),侧面也印证了Go语言在后端领域具备较强的业务实战落地能力,对打算采用Go的互联网企业,具有较强的指导和借鉴意义。
业界认可度
golang作为云原生的首选语言,在业界获得广泛的认可。基于golang的很多明星项目,包括docker,k8s,etcd,influxdb,tidb,prometheus,kibana,nsq等覆盖了容器化,容器编排,存储,监控,消息队列等各个场景, 在各大公司都获得了大量的应用。同时从github拉取数据查看语言流行程度, 我们对比了java,c++,c,go等语言发现,golang在github开源库的使用上越来越流行。如下图所示的golang占比情况:
趋势
全面转到Go Module:官方会终止对GOPATH的开发支持,全面转到Go Module。
2021年,golang中的泛型还要持续打磨。
随着云原生浪潮,越来越多的企业将会考虑将Go作为其主要后端开发语言。
技术的发展是一分钟也不会停滞。 可以预见云原生、微服务等新技术依旧是后台技术发展趋势,2021年下半年也会有更多创新出现。
近期热文推荐
你“在看”我吗?