与 Claudia.js 的作者 Gojko Adzic 谈论如何通过 Claudia 将 Node.js 微服务部署至 AWS Lambda

阅读数:745 2016 年 3 月 8 日

话题:JavaScriptDevOpsNode.js语言 & 开发

InfoQ 最近与Gojko Adzic进行了一次访谈,谈到了他最近设计的项目Claudia.js。这是一个 JavaScript 工具,能够帮助用户将 Node.js 微服务应用部署至 Amazon Web Service(AWS)Lambda。Claudia.js 可通过一个单一的命令进行 AWS Lambda 函数与 Web API 的部署、自动处理 IAM 角色传递的等待过程、配置 console.log 的输出以传送至 CloudWatch、并且简化了 AWS Lambda 函数在生产环境、开发环境与测试环境上的版本管理工作。

AWS Lambda是一种计算服务,它对传入的事件进行响应并运行相应的代码,并且能够自动管理底层的计算资源。AWS Lambda 可自动地运行代码以响应各种事件,例如某个 Amazon S3 bucket 中的数据改动、Amazon DynamoDB 数据表的修改、或是对于Amazon API Gateway传入的 HTTP 请求进行响应(此即所谓的“serverless”架构)。

Adzic 是 Neuri Consulting LLP 的合伙人之一,他认为AWS Lambda 的部署可能会因为牵涉的步骤太多而显得过于复杂。因此他创建了Claudia.js,通过这个工具可以简化 Lambda 函数的创建或更新。Claudia.js 不仅支持通过单一的命令部署基于 Node.js 的“微服务”AWS Lambda 应用,还实现了各种复杂任务的自动化,比如它允许将 console.log 的输出传送至 CloudWatch 中,并且对 Amazon API Gateway 资源进行配置,使其行为更符合 JavaScript 开发者的预期。

InfoQ 与 Adzic 进行了一次访谈,谈到了 Claudia.js 的开发过程、创建这门工具的动力和它的目标、以及使用 AWS Lambda 处理生产环境中的实际负载的可行性。

InfoQ:你好 Gojko,感谢你今天能够抽空与 InfoQ 进行这次对话。你能否为我们介绍一下由你创建的新型微服务部署项目 Claudia.js?

Adzic:Claudia.js 能够自动化部署工作流,并且简化了让 JavaScript 代码在 AWS Lambda 中正常运行所必须进行的一些容易出错的任务,让开发者能够专注于解决重要的问题,而无需担任 AWS 服务本身。通过 Claudia 所配置的部署过程是按照 JavaScript 开发者所预期的方式运行的,使这些开发者更适应 Claudia 的使用。在 Claudia 中只需不到 5 分钟就能够创建并部署一个简单的 HTTP 终结点,可以观看这个视频以了解整个过程。

AWS Lambda 与 API Gateway 为用户提供了按需扩展、零运维操作以及几乎免费的执行,按使用量收费的功能。他们确实是在运行服务端代码方面很有力的竞争者。但是,整个配置过程显得过于繁琐,尤其是对于简单的场景来说更为明显。由于其运行时是针对运行 Java 代码而设计的,因此如果用户需要运行 Node.js 功能,就必须解决大量的问题,并且在这方面缺乏良好的文档说明。

Claudia.js 为用户解决了以上所有问题。举例来说,在传统方式下,将一个 JavaScript 方面暴露为 Web API 需要编写约 120 行 shell 脚本,而这一切在 Claudia 中可以由一个单一的命令代替。

InfoQ:Claudia 的总体目标是什么,有哪些方面不属于 Claudia 的目标?举例来说,有关微服务的工具不断涌现,包括 Seneca.js、go-kit 和 Spring Cloud,不过 Claudia 似乎特别专注于应用的部署?

Adzic:目前来说,微服务在云环境上的应用正在蓬勃发展,新的框架与工具不断涌现。你之前提到的工具多数都属于框架的范畴,它们帮助用户逐步实现标准的通信任务、完成工作的分布以及服务发现。这些功能对于我们的使用场景来说有些过度了。我们只希望运行一些简单的东西,例如响应用户的 GET 与 POST 请求、在 S3 中处理文件,或是操作 AWS SQS/SNS 队列中的消息。AWS 服务已经足够完成这些任务了,我们也不介意直接调用这些服务。

在我们从 Heroku 平台进行迁移时遇到了一个大问题,即每次迁移都需要进行大量的样板式的配置工作,这种工作即复杂又容易出错。我们并不想改动组织代码、组织项目、连接到服务以及对 AWS 的功能进行抽象的方式。我们所需的仅仅是让代码能够可靠地、快速地在 Lambda 中运行。

而 Claudia 完全符合我们的目标,它为用户承担了所有重复的配置工作,使代码的配置得到了大大的简化。同时,在将现有的 API 迁移为 Lambda 时,Claudia 几乎不会为用户带来任何负担。它负责收集所有查询字符串、表单提交以及请求头信息,使它们易于在 JavaScript 代码中进行访问。它对于处理流程进行了适当的配置,让其更符合 JavaScript API 的期望,并让用户决定如何通过代码实现所需的功能。

InfoQ:与通过标准的方式将应用部署至 AWS Lambda 相比,使用 Claudia 进行部署有哪些不同?它与由 Mitch Garnaat 所设计的“Kappa”工具又有何不同?

Adzic:Claudia 同样使用标准方式将应用部署至 AWS

Lambda 中,它只是将所有样板式的过程实现了自动化。我的想法是不要引入过多的新鲜特性,因此我们使用了标准的 AWS Node.js SDK 以完成所有工作。它能够帮助用户专注于要解决的问题,而无需死记硬背 AWS API 调用的顺序、以及各种必须遵循的安全策略。

Kappa 的功能与 Claudia 非常相似,但它是针对 Python 的。此外还有一些针对其他语言的类似的部署工具,例如 Apex 等等。但我并没有找到一种能够很好地处理 JavaScript 的工具。泛用的框架虽然能够支持更多类型的运行时,但必须由开发者负责处理各种特定于语言的问题。当我们尝试在 Lambda 中运行 JavaScript 时,就遇到了大量特定于语言的问题。

Claudia 只支持 JavaScript/Node.js 环境,但它在这方面的表现非常出色。由于 Claudia 专注于 Node.js,因此它能够自动安装各种模板,将参数与结果转换为可以通过 JavaScript 轻松调用的对象,并且使它的工作方式符合 JavaScript 开发者的预期。举例来说,标准的错误报告仍将返回 HTTP 代码 200,这对于 Java 来说并非什么严重的问题,但它会使多数 JavaScript Promise HTTP 库无法正常工作。Claudia 会自动对 API Gatway 进行配置,使其返回 HTTP 500。

InfoQ:你能否描述一下创建 Claudia.js 的动力是什么?它是否是一个大型项目中的一个组成部分?

Adzic:在开发MindMup 2.0时,我们开始将后端代码从 Heroku 迁移至 AWS Lambda,为此我们收集了大量的检查清单与故障诊断方面的诀窍,让整个迁移过程更加顺利。而 Claudia 则通过一个易于使用的 API 为用户实现了这些任务的自动化。

今后,我们还计划将所有服务端代码都迁移至 Lambda 上。MindMup 2.0 本质上就是一个单一的 HTML 文件,它通过一个 CDN 服务展现给用户,通过一些后端 API 实现动态功能。这使我们能够轻易地支持大规模的用户使用。

InfoQ:你认为 AWS Lambda 是否已经准备好应用在生产环境中了?如果确实如此,它的典型使用场景又包括哪些?

Adzic:对于我们来说,Lambda 出色地完成了我们所需的功能。但其他项目或许会遇到一些不同的限制,因此“准备好应用在生产环境中”这种说法完全取决于你的上下文。在我看来,它可以成为相对隔离式的服务端处理方式的一种良好的替代产品。在服务端处理中产生一到两秒的延迟没什么问题,但吞吐量、并行执行以及按需伸缩等属性则显得非常重要。这方面的例子包括文件转换、处理用户文件上传、发送通知、调度任务、以及认证或验证。

Lambda 的竞争优势在于无需管理员的干预而实现自动伸缩且按使用量收费。如果代码本身需要大量的管理性工作,那么使用该工具的意义并不大。而如果应用的延误需要限制在微秒级,那么 Lambda(目前来说)或许并非你最佳的选择。

InfoQ:你是否期望用户能够帮助你完善这个项目?如果这样,最好的贡献方式是什么?

Adzic:当然了。Claudia 是一个开源项目,我相信一定有许多其他开发者也在考虑迁移至云代码执行环境。目前来说,它满足了我们所需的一切功能,但如果其他人愿意参与这一项目,我们可以将它改造得适应更广泛的使用场景。项目的代码托管在 GitHub 上,最佳的贡献方式是创建一个 fork 并提交 pull request。该项目的 GitHub 库地址是https://github.com/claudiajs/claudia

InfoQ:再次感谢你能够参与这次谈话。还有哪些内容是你希望分享给 InfoQ 的读者的吗?

Adzic:总的来说,如果你希望创建一些简单的服务,并且运行在 AWS Lambda 中。或者是你正在寻找一些开销较低的、易于上手的工具,并且只希望使用 Node.js 运行时,那么 Claudia 是一个很好的选择。如果你希望使用 SDK、对于服务的分布、分配或是发现功能具有细粒度的控制能力,或是能够支持不同类型的运行时等等,那么建议你去寻找其他的替代工具。

Claudia.js项目的 GitHub 库上可以找到关于该项目的更多信息,Adzic 也创建了一个三分钟的视频“介绍 Claudia.js”,提供了对该工具应用方式的一个高层次的概述。

查看英文原文:Deploying Node.js Microservices to AWS Lambda with Claudia.js: Q&A with Author Gojko Adzic

立即免费注册 AWS 账号,获得 12 个月免费套餐:点击注册

有云计算问题?立刻联系 AWS 云计算专家:立即联系