选择无服务器:Babbel 的迁移故事

news2025/1/10 12:06:08

Babbel 是什么?

Babbel 是一个完整的语言学习产品生态系统,囊括了世界上最畅销的语言学习应用程序。我们已售出超过 1000 万份订阅和超过 60,000 门涵盖 14 种语言的课程,创造了全球第一语言学习目的地。自 2007 年推出产品的第一天起,我们就一直在 Amazon Web Services( Amazon)上运行我们的平台,并且经常是 AWS 新服务产品的早期采用者。由于我们的 Babbel 学习生态系统是纯数字化的,因此它严重依赖于底层技术,这些技术不仅需要可靠稳定,而且需要能够在任何时间点都具有可扩展性。这会带来挑战和机遇,尤其是随着产品供应的增加和服务格局的变化。

Babbel 一直在不断扩大我们的学员基础,从 2007 年到 2020 年,我们的访问量随之增加。2020 年,Babbel 的学员群体大幅增长,来自美国和我们主要欧洲市场的流量增长了两到三倍。随着疫情导致全球出现各种不同的法规政策,许多人选择学习一门新语言或提高他们的语言技能。这使传入流量出现更多峰值,从未有过如此规模。在此期间,我们没有担心我们的基础设施是否会受到用户需求不断变化所带来的挑战。

但是,在 2020 年之前,我们在 Babbel 构建的用于托管 Babbel 服务的平台并未利用所有 Amazon 无服务器服务。它依赖于在 Amazon OpsWorks 上运行的旧堆栈,这无法再满足需求。在本文中,我们描述了促使 Babbel 考虑做出改变的原因、我们考虑的选项以及我们最终如何将生产工作负载迁移到 Amazon Fargate 上的 Amazon ECS 和 Amazon Lambda。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

为什么要改变我们的架构?

在一个不断增长和动态变化的环境中,我们有动力去改变和改进事物。我们努力寻找改进机会,以便为我们的学员提供更好的学习体验。可以想象,优先考虑技术层面并不一定会轻松实现学习体验的改进,但我们会将一些支柱作为路标:

  • 加快开发速度并缩短发布时间
  • 减少维护工作
  • 拥有并维护最新的环境
  • 缩短功能交付时间

在开始该项目之前,我们运行的是旧版本的 OpsWorks,这要求我们使用过时的 Chef 版本来管理 OpsWorks EC2 实例的配置。这些实例基于较旧的实例类型,并使用其生命周期即将结束的 Ubuntu 版本,因此绝对需要采取行动。将 Chef Cookbook 升级到新 Chef 版本、升级 Ubuntu 版本以及升级旧的 OpsWorks EC2 实例将花费大量时间。此外,我们的部署、回滚和升级占用了开发人员大量的维护工作时间,而我们希望减少这些时间。在流量快速激增的情况下,我们的扩缩时间比我们预期的要长,而且自动扩缩不可靠。某些情况下,将额外的 EC2 实例添加到 OpsWorks 集群需要长达 25 分钟。对于负载均衡,我们只能使用 Classic ELB,它不具备我们想要使用的全部功能,例如通过 Cognito 进行身份验证及路由。这些功能在应用程序负载均衡器(ALB)中可用,但 OpsWorks 当时不支持 ALB。鉴于这些情况,我们得出结论,理想的解决方案应解决这些问题,这意味着我们必须放弃 OpsWorks EC2 设置。

考虑迁移选项

在分析潜在的技术解决方案之前,我们从功能角度讨论了最适合我们的解决方案。我们一致认为,理想情况下,解决方案应该

  • 与我们现有的 Amazon 架构以及 Terraform 投资和结构完美集成

  • 通过专门的服务和支持团队积极开发并保持最新状态

  • 腾出运营和维护时间,使我们专注于能为学员或 Babbel 工程团队带来更多价值的事情 我们很清楚,正确的解决方案是实现无服务器。我们接着研究了可用的解决方案,以摆脱 OpsWorks 并取代整个计算和托管层。我们考虑的选择是:

  • Amazon Lambda

  • Amazon Elastic Container Service(Amazon ECS)

  • Amazon Elastic Kubernetes Service(Amazon EKS) 关于这些选项,我们得出了以下结论:

Amazon Lambda

理想情况下,我们将在 Lambda 上运行几乎所有内容。默认情况下,扩缩是自动进行的,无需配置,无需维护实例,无需在操作系统层自己进行操作系统和安全更新,并且部署/回滚是即时的。对于某些服务,这是可能的,我们决定为它们使用 Lambda。但是,我们发现 Lambda 并非适合所有服务的解决方案。我们有一些需要 Docker 的多用途服务,在 2020 年初进行评估时,Lambda 尚不支持容器映像格式。

Amazon ECS

由于 Lambda 不适合此类服务,因此我们必须决定在哪个平台上运行我们的(Docker)容器。我们评估了 Amazon EKS 和 Amazon ECS,有以下四个选项可供选择:

  • EC2 上的 ECS
  • Fargate 上的 ECS
  • EC2 上的 EKS
  • Fargate 上的 EKS

由于使用 Fargate 上的 ECS 和 EC2 上的 ECS 非常相似,与 Kubernetes 和 EKS(在 EC2 或 Fargate 上)相比,它们对于整个生态系统而言,属于同一种替代解决方案,因此我们权衡了使用这两种技术堆栈的利弊。2019 年,我们开始在 Fargate 上运行 ECS,最初缺少我们当时需要的一些功能(例如容器的成本分配标签)。我们的 AWS 客户经理帮助我们处理了功能请求,这些功能随后得以实施。这些功能发布后,我们就顺利地将所有新的 Docker 化的服务迁移到 Fargate 上的 ECS 了。对于我们的架构而言,在 EC2 和 Fargate 之间,Fargate 是更好的选择,因为它消除了底层 EC2 机器的维护工作。该技术堆栈还很容易与其余的 AWS 服务和 Terraform 代码库集成,在这方面我们已经有管理经验。

Amazon EKS

在权衡运行 EKS 的利弊时,我们认为这不是我们的用例和基础设施设置所必需的。我们的主要目标是建立一个平台,以最少的工作量扩展我们的 Docker 容器,同时对环境的其余部分和 Amazon 服务集成进行最少的更改。此外,我们希望确保尽可能减少运维工作量,因为这不会给我们的学员带来任何价值。使用 Kubernetes,我们认为学习难度更大,需要对现有环境进行更多更改,并需要更多的运营和维护工作。我们认为,我们可以使用更加以 Amazon 为中心的基础设施即代码,更好地分离开发和基础设施,我们正在通过 Terraform 管理这种基础设施即代码(例如,使用 Amazon IAM)。简而言之,我们希望改变我们的计算/托管环境,而不必对我们的系统和服务,以及我们运行部署、管理网络和安全组的方式等进行更大的调整。

2019/2020 年初,EKS 仍然是一项较新的服务。当时,我们决定不采用 EKS(或 Kubernetes)是担忧不能很好地支持在 Amazon 上运行的 Kubernetes 功能。虽然 EKS 使用上游 Kubernetes 代码(不加修改),但我们担心 Kubernetes 最新版本与 EKS 可用版本之间存在差异。当时,我们不确定能否立即访问所有最新的 Kubernetes 功能。在这种情况下,特定功能并没有成为障碍,但我们决定使用 Amazon 优先的服务,而不是 Amazon 托管的开源服务。当然,使用 Kubernetes 有很多好处,比如在运行混合云环境时能够进行更精细的控制,但这对我们来说并不重要。总而言之,由于上述原因,我们决定使用 ECS 而不是 EKS(因此我们没有比较应该在 EC2 还是 Fargate 上运行 EKS)。

迁移工作负载

由于我们以前有过运行 Amazon Lambda 的经验,从 Amazon OpsWorks 到 Amazon Lambda 的初始服务迁移进展迅速,没有出现任何不可预见的问题。由于我们没有任何使用 Amazon Fargate 的经验,因此在开始迁移到 Amazon Fargate 之前,我们必须将所有剩余服务 Doker 化。除了由于缺乏此类迁移经验而不得不克服的技术难题外,还需要进行大量的团队间协调,因为迁移涉及 10 多种服务,包括面向客户的服务和内部服务。当然,前几项服务花费的时间最多,因为我们必须找出最好的方法来进行部署、微调我们的自动扩缩,并确保将服务迁移到 Docker 的过程正常进行。我们首先开始迁移对产品没有影响的内部服务,然后迁移对客户有影响的内部服务,最后是面向客户的服务。现在,最终设置会有所不同,因为我们的服务具有不同的集成和环境(例如,有时我们会将 Amazon Cognito 与 ALB 一起使用,或者在 ALB 前面使用 CDN 等)。以下是简化的之前/之后比较,如下所示:

结论

一旦我们完成了项目的技术变更,就该评估我们是否实现了目标。总而言之,最初的痛点是:

  • OpsWorks/Chef/EC2 的维护工作量很大,大量开发时间花在维护上,而不是为客户改进应用程序

  • 由于底层的 OpsWorks 和 Chef 堆栈,扩缩不可靠,预热时间长达 20 分钟以上

  • 使用 OpsWorks 的设置无法使用应用程序负载均衡器,后者具有我们想要使用的功能 通过切换到 Amazon Fargate 上的 Amazon ECS,以及 Amazon Lambda,我们获得了以下好处:

  • 更快的发布和回滚速度,更少的维护时间,使我们能够专注于为学员构建新功能。使用 Amazon Lambda 以及 Amazon Fargate 上的 Amazon ECS,我们从每个 OpsWorks 集群 25-30 分钟的部署时间,变为几乎即时部署/回滚。

  • 与我们之前的设置相比,可实现快速的自动可扩展性。2020 年 3 月,我们的流量出人意料地快速增长,产生来自世界各地的全天候需求高峰,事实证明这样做很有用。

  • 将特定 Amazon 服务与其他 Amazon 服务集成在一起,以实现不同的目的,例如通过使用 Amazon ECR 映像扫描或通过 ALB 直接身份验证,将安全扫描作为发布流程的一部分进行集成

  • 降低成本,这是以更高效的方式利用我们的计算工作负载的附带结果。我们已经在 How to do more with fewer servers 中详细描述了这一点

关于 Babbel

Babbel 的使命是:让所有人都能学习语言。这意味着要开发能够帮助人们跨文化联系和交流的产品。Babbel、Babbel Live 和 Babbel for Business 致力于在真实情境下、在真人之间运用语言。并且行之有效:耶鲁大学、纽约城市大学和密歇根州立大学的研究证明了它的有效性。关键是人文与技术的融合。150 多名语言学家精心制作了超过 6 万节课,涵盖 14 种语言,不断分析用户行为,以塑造和调整学员的体验。柏林和纽约总部共有来自 60 多个国家/地区的 750 名员工,正是他们之间的个体差异塑造了独一无二的人类。Babbel 是全球最赚钱的语言学习应用程序,已售出超过 1000 万份订阅。欲了解更多信息,请访问 www.babbel.com 或在 App Store 或 Play Store 中下载应用程序。

本篇作者

Gyorgi Stoykov

Gyorgi Stoykov MSc. 是 Babbel 基础设施团队的高级经理,目前位于柏林。他在财富 500 强公司、初创企业和学术界等各种环境中的云计算和基础设施方面拥有丰富的经验。他对 DevOps、Amazon 以及通过应用敏捷和 DevOps 最佳实践帮助组织构建云原生产品充满热情。

文章来源:https://dev.amazoncloud.cn/column/article/6309a3fa0c9a20404da79140?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vivid源码分析

vivid源码分析 文章目录 vivid源码分析如何编写V4L2驱动分析vivid.c的open,read,write,ioctl过程openreadioctlv4l2_ctrl_handler使用过程 如何编写V4L2驱动 分配/设置/注册v4l2_device.v4l2_device_register,v4l2_device(辅助作用,提供自旋锁,引用计数…

LeetCode单链表OJ题目做题思路分享

目录 移除链表元素链表的中间节点链表中倒数第K个节点合并两个有序链表 移除链表元素 链接: link 题目描述: 思路分享: 我们上个博客分享了第一种方法,下面我们分析第二种方法:思路就是将每一个不等于我们要删除的值的节点依次尾…

【硬件】嵌入式电子设计基础之产品实践

电子技术是一门实践性非常强的学科,学习电子元器件基础知识和设计技能,最终为的是把具备一定功能的电路板制作出来,解决科研、生产、生活中的实际问题。 本篇文章从实际的电子产品出发,让您能够初步体验电子产品的硬件设计过程&am…

【Unity编辑器】拓展Project视图

目录 1、拓展右键菜单 2、创建一个菜单 3、拓展布局 4、监听事件 首先创建一个Editor文件夹,此文件夹可以作为多个目录的子文件夹存在,这样开发者就可以按照功能来划分,将不同功能的编辑代码放在不同的Editor目录下。 如果属于编辑模式下…

多维时序 | MATLAB实现BP、SVM、LSSVM多变量时间序列预测(考虑历史特征的影响,多指标、多图输出)

多维时序 | MATLAB实现BP、SVM、LSSVM多变量时间序列负荷预测(考虑历史特征的影响,多指标、多图输出) 目录 多维时序 | MATLAB实现BP、SVM、LSSVM多变量时间序列负荷预测(考虑历史特征的影响,多指标、多图输出)预测效果基本介绍程序设计学习总结参考资料…

大规模并行处理架构Doris概述篇

目录 1 Doris概述篇1.1 前言1.2 Doris简介1.3 核心特性1.4 Doris特点1.5 Doris发展历程1.6 对比其他的数据分析框架1.7 开源OLAP引擎对比1.8 使用场景1.9 使用用户 2 Doris原理篇2.1 名称解释2.2 整体架构2.3 元数据结构2.4 数据分发 1 Doris概述篇 1.1 前言 Doris由百度大数据…

BI 商业智能和报表,傻傻分不清楚?一文给你讲透

我们经常所听到的大数据、商业智能BI、数据分析、数据挖掘等我们都统称为数据信息化。数据信息化可以帮助企业全面的了解企业的经营管理,从经验驱动到数据驱动,降低情绪、心理等主观影响,形成以数据为基础的业务决策支撑,提高决策…

C++入门(内容补充)

目录 前言 1.auto关键字 1.1 auto的使用细则 1.2 auto不能推导的场景 2. 基于范围的for循环(C11) 2.1 范围for的使用条件 3.指针空值nullptr(C11) 3.1 C98中的指针空值 前言 之前给大家更新了一系列关于C的基础语法,那么今天小编再给大家进行部分内容的补充…

【C++】线程库

文章目录 线程库(thread)线程安全锁实现两个线程交替打印1-100 线程库(thread) 在C11之前,涉及到多线程问题,都是和平台相关的,比如Windows和Linux下各有自己的接口,这使得代码的可…

python函数的递归调用

引入 函数既可以嵌套定义也可以嵌套调用。嵌套定义指的是在定义一个函数时在该函数内部定义另一个函数;嵌套调用指的是在调用一个函数的过程中函数内部有调用另一个函数。而函数的递归调用指的是在调用一个函数的过程中又直接或者间接的调用该函数本身。 函数递归…

Python入门(三)变量和简单数据类型(二)

变量和简单数据类型(二) 1.数1.1 整数操作1.2 浮点数操作1.3 整数和浮点数1.4 数中的下划线1.5 同时给多个变量赋值1.6 常量 2.注释2.1 如何编写注释2.2 编写什么样的注释 作者:Xiou 1.数 数在编程中是经常使用的一种数据类型,可…

【目标检测论文阅读笔记】Dynamic Head: Unifying Object Detection Heads with Attentions

Abstract 在目标检测中结合定位和分类的复杂性导致了方法的蓬勃发展。以前的工作试图提高各种目标检测头的性能,但未能提出统一的观点。在本文中,我们提出了一种新颖的动态头部框架 来统一目标检测头部和注意力。通过在用于尺度感知的特征级别之间、用于…

嵌入式Linux:FrameBuffer 和 DRM/KMS(一)

文章目录 前言: Linux 的两种显示方案FrameBufferDRM1、GEM2、KMS 参考:RK3399 探索之旅 / Display 子系统 / 基础概念 参考:DRM架构介绍(一) 前言: Linux 的两种显示方案 包括: FBDEV: Framebuffer Device DRM/KM…

【MediaSoup c#】 worker的创建

js rust 不太熟,c# 似乎还好懂一些。学习media soup 的各个组件及大体使用方式学习其设计理念。MediasoupServer 管理worker列表 worker的表达是通过 IWorker 抽象类 拥有一个observer 实例 (EventEmitter): /// <summary>/// Observer instance./// </summary&g…

顺序表和链表优缺点以及区别

顺序表和链表的区别 顺序表优点缺点 链表优点缺点 顺序表和链表不同点 顺序表 优点 1.尾插尾删效率高 2.支持随机访问 3/相比于链&#xff0c;cpu高速缓存命中率更高 缺点 1.在头部和中部插入删除效率底 2.需要大片连续空间&#xff0c;改变容量不方便 链表 优点 1.不需要…

【嵌入式Linux驱动】驱动开发调试相关的关系记录

https://www.processon.com/mindmap/64537772b546c76a2f37bd2f

MySQL概述 -- 数据模型SQL简介DDL数据库操作

一. 数据模型 介绍完了Mysql数据库的安装配置之后&#xff0c;接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后&#xff0c;我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。 在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#x…

SPSS如何进行对应分析之案例实训?

文章目录 0.引言1.对应分析2.多重对应分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对对应分析进行阐述。 1.对应分析 &#…

混合策略改进的金枪鱼群优化算法(HTSO)-附代码

混合策略改进的金枪鱼群优化算法(HTSO) 文章目录 混合策略改进的金枪鱼群优化算法(HTSO)1.金枪鱼群优化算法2. 改进金枪鱼群优化算法2.1 Circle混沌映射初始化种群Circle2.2 Levy flight改进螺旋式觅食 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&#xff1a;针对金枪…

操作系统考试复习——第三章 进程调度和实时调度

进程调度的方式分为&#xff1a;抢占式和非抢占式 采用非抢占式时&#xff0c;一旦把处理机分配给某进程后&#xff0c;就让他一直运行下去&#xff0c;决不会因为时钟中断或其他任何原因去抢占当前正在运行进程的处理机。直至该进程完成或因为某件事情堵塞&#xff0c;才把处…