几个月前,我发布了一些关于缩放的想法,并承诺很快会发布更多。嗯,说到快速扩展--在3月份的短短两周内,可汗学院的网站使用量就增长到去年同期的2.5倍,并且到目前为止一直保持着这个水平。随着世界各地的学校因冠状病毒大流行而关闭,学生、家长和教师转向远程学习,可汗学院能够做出回应,免费提供高质量的内容和课堂体验。在4月份,我们在我们的平台上为3000万名学习者提供了服务。最近一项针对家长的全国性调查发现,可汗学院是“使用最多的在线资源”。
我感到自豪的是,我们在没有中断用户的情况下吸收了这种快速增长。除了在几天内迅速做出反应以缓解压力点之外,我们已经提前做好了准备,这种准备产生了红利。我们很容易进行扩展,这在很大程度上是因为我们的体系结构和谨慎选择外部服务并正确使用它们的严格实践。
因此,在这篇文章中,我将讨论对我们网站的可伸缩性起关键作用的架构方面。
我们架构的两个基本组件在这里特别适合我们。我们使用Google Cloud,包括AppEngine、Datastore和Memcache,以及Fastly CDN,它们是无服务器和缓存战略的主干,而无服务器和缓存战略是我们可伸缩性的关键。
使用GCP App Engine,这是一个完全托管的环境,这意味着我们几乎可以毫不费力地轻松扩展。即使流量大幅增加,我们的网站仍然保持了良好的运行状态,只需最少的干预。我们自己不需要担心负载平衡问题,因为服务器实例是在没有任何干预的情况下按需启动的。我们同样使用数据存储区,它可以自动横向扩展存储和访问容量,其方式与App Engine横向扩展Web服务器实例的方式大致相同。
快速CDN允许我们缓存所有静态数据,并最大限度地减少服务器行程。巨大的可扩展性,它还帮助我们优化主机资源,在我们的App Engine无服务器模型中,成本随着使用量的增加而线性增长。如架构图所示,所有客户端请求都能快速通过,因此我们可以防止不必要的服务器流量,从而提高性能。我们主要从YouTube下载视频,其次是Fastly。这也降低了成本,同时确保了视频的快速加载。
除了快速缓存静态数据外,我们还广泛缓存常见查询、用户首选项和会话数据,并利用这一点来加快数据获取性能。除了围绕数据存储区实施其他关键最佳做法外,我们还大量使用memcache,以确保快速响应。
当然,我们的现场可靠性(SRE)团队需要做好铁板一块的监控准备--我们做到了。我们注意到在最初几天出现了一些速度减慢的情况,并发现是部署导致了这些点击率。应我们的要求,Google增加了我们的Memcache容量,一周之内,我们就安心地回到了正常的持续部署模式。这一速度非常关键,因为我们的团队正在快速开发资源,以尽可能轻松地指导新站点用户进行自注册。
总体而言,我们努力仔细选择服务,遵循最佳实践,并根据需要开发我们自己的服务。凭借正确的技术、精心的准备和我们令人惊叹的工程团队的现场调整,我们能够不间断地为现在比以往任何时候都更依赖我们的学生、家长和教师提供服务。
可汗学院使用量的增加也增加了我们的托管成本,我们是一个非营利性组织,依赖于像您这样的人的慈善捐款。