Code.org 是面向计算机编程教育的非营利性组织。该组织由 Ali 和 Hadi Partovi 兄弟二人创办,致力于增加美国学校开设的计算机科学课程的数量,以及吸引更多女性和弱势有色人种学生参加此类课程。Code.org 在其网站上提供编程课程和教程,并与联邦和地方组织一道倡导大力举办计算机科学课程。Code.org 创办于 2013 年 1 月,是一家公共性质的 501c3 组织,依靠公众捐赠来维持运营。

计算机科学教育周 (CSEdWeek) 是一个年度项目,致力于在全球推广计算机科学。图 1 展示了 Code.org 网站提供的在线课程。

code.org-course-image

图 1. Code.org 上的学生编程课程

2013 年 8 月,Code.org 决定在当年 12 月举办的 CSEdWeek 期间开展 Hour of Code 活动,向学生介绍该组织网站上的编程课程和教程。在使用 Amazon Web Services (AWS) 之前,Code.org 的环境由一组运行不同技术的不同网站组成。Code.org 这家非营利组织制定了要吸引 1000 万名学生的远大目标,其工程师有四个月的时间建立一个能够支持此次活动的平台。

Code.org 网站需要能够处理 CSEdWeek 期间学生登录造成的极高尖峰流量,同时要控制成本。该组织考虑了其他多家云提供商,但最终选择了 AWS,皆因 AWS 云能提供灵活性、低成本和全套服务。

此外,Code.org 将能够利用 AWS 的全球基础设施和多个区域来做好冗余性和高可用性规划。软件工程师 Geoffrey Elliott 说:“最初,我们计划开展一个全国性的活动。后来才想到开展国际性活动,但由于我们的平台是以 AWS 为基础构建的,因此这个想法并没有改变我们的设计。我们知道我们可以在另一个 AWS 区域中开展活动和扩大规模。”

Code.org 的环境在 AWS 的两个堆栈上运行:一个用于交互教程,另一个用于有兴趣详细了解 Hour of Code 活动的用户。两个堆栈均在美国东部 (代号“弗吉尼亚”) 区域中运行,并且使用 Amazon RDS 多可用区在数据库层实现自动故障转移和高可用性。

Code.org 使用 Blockly 和其他工具创建自己的教程,以便为学生创造图形化的沉浸式体验。该组织还与 Khan Academy 及其他几个合作伙伴合作,为网站提供大量教程。Code.org 在 AWS 上运行 Web 教程,并使用 Ruby on Rails、Amazon Relational Database Service (Amazon RDS) 上的 MySQL、Amazon CloudFront 提供内容,以及使用 Amazon Route 53 作为域名系统 (DNS) Web 服务。

Elliott 说:“开始使用像 Amazon Route 53 这样的服务之后,就很难离开它们了。大约每隔 90 天,我们的某台本地服务器就会被分配一个新的 IP 地址。手动调整 DNS 设置听起来没多少工作,但是,一旦您根本没必要做这件事,这就很重要了。Amazon Route 53 对终端节点使用别名而不是实际的 IP 地址,因此 DNS 在大多数情况下是自动更新的。我不用为担心 IP 地址变化而头痛了。因此,我非常看重 AWS 提供的这项功能和其他功能。”

Code.org 曾花费时间测试和识别其 Web 应用程序,以找出瓶颈和改善性能。为了优化运营,工程师将服务器活动划分为读取操作 (在用户读取页面时) 和写入操作 (在用户填写表单时)。前端服务器生成并缓存页面一次,然后将所有写入操作转移到负责更新数据库的后端服务器。Elastic Load Balancing 可确保高可用性,以处理极高的尖峰流量。

工程师部署了 Varnish 缓存来存放和更快地提供动态 Web 内容。多可用区配置中的 Amazon RDS 数据库实例支持数据库层。CloudFront 将来自 AWS 边缘站点的内容提供给用户,从而进一步减轻前端服务器上的负载。CloudFront 还允许以最高效的方式将内容提供给全球用户。Elliott:“通过使用 CloudFront,我们能够实现扩展,在尖峰负载期间同时应对 30 多万名用户。

Amazon Elastic Compute Cloud (Amazon EC2) 可提供多种实例类型,以满足不同的计算需求。经过全面测试后,Code.org 的工程师发现 Amazon EC2 计算优化实例最适合他们的 Web 服务器。虽然 Web 流量并不占用大量计算资源,但这些机器生成了占用大量 CPU 资源的页面。

Elliott 说:“为了获得最佳吞吐量,必须使用最快的处理器。我们在前端机器中使用 C3 实例类型,因为它们的性能和性价比都很高。”性能测试表明 CPU 对于 Code.org 的缓存服务器并非关键所在,因此,该组织使用了将整个缓存放在 RAM 中的低费用实例。

由于在 AWS 上运行,Code.org 能够按计划在 CSEdWeek 期间举行 Hour of Code 活动。Elliott 表示:“我们的目标是吸引 1000 万名学员,实际却有 2000 万的参与者。我们的网站在 AWS Cloud 上运行,因而极富弹性。活动周期间,我们网站访问量从 0 飙升到 2000 万个程序员,之后还能高效地收缩回去。AWS 简直太棒了。”

自“代码时间”活动开始以来,来自 170 多个国家/地区的 2500 万名学生 (其中一半是女性) 在 Code.org 上编写了近十亿行代码。

活动开展之后,Code.org 发现它过度预配置,于是工程师团队开始停用部分机器。“在知道 AWS 如何扩展之后,我们能够减少实例,以节约成本。即使流量极高而且每天都在增长,我们也能停用大约 50% 的机器。”在 Hour of Code 期间,Code.org 为前端 Web 服务器启用了 21 个实例,之后缩减到原规模,仅运行两个实例。

AWS 架构师和商业级别的 AWS Support 帮助 Code.org 在活动周之前和期间仔细调整其架构。在开展活动之前,该组织同 AWS 架构师一起将冗余性和高可用性嵌入到 Web 平台中,并跨多个可用区设置了 Amazon RDS 多可用区。在网站上线之前的周末,AWS Support 工程师启动了预热流程,以确保 Elastic Load Balancing 能够处理突然增多的流量。

在 CSEdWeek 期间,AWS Support 工程师提供了一个解决方案,让电子邮件能通过 Amazon Simple Email Service (Amazon SES) 更快地发送出去。Elliott 评论道:“AWS 太令人惊叹了,我们开始担心送达率之类的细节,而不是担心在线率了。在活动周期间,我们的工作重点是停用部分机器,当发现一切运转正常时,我们感到很高兴。”

使用 AWS 帮助 Code.org 将工作重点放在目标而不是基础设施上。Elliot 说:“我们的期望是服务能够正常进行,而它确实做到了。AWS 一直给我们带来非凡的体验。”

要了解关于 AWS 如何帮助满足 Web 应用程序需求的更多信息,请访问我们的 Web 应用程序详细信息页面:http://aws.amazon.com/web-mobile-social/