背景故事
为什么要创建 FaasJS?
FaasJS 要解决什么问题?
自从 AWS Lambda 带来了 Serverless 热潮后,不少公司和个人都尝试了 FaaS 服务,并欣喜于其轻量和易于上手的特点。
但当使用 FaaS 服务来开发企业级应用时,却遇到了缺乏框架、工具和实践指导的问题。
所以我打算将我在简单心理实践 FasS 的经验总结和优化,做成一套简单易上手的 FasS 的框架。
FaasJS 将如何解决问题?
以下是我在实践过程中遇到的主要问题及解决办法:
函数随着数量增多而越来越难以管理
通过对函数名设定命名规则,以多个层级的命名空间来管理函数,并明确每个函数的作用。
函数之间互相调用导致出故障时难以追查
- 在业务流程的起始点设置追踪 ID,并继承和贯穿整个业务流程,以这种方式来查找日志并追查故障;
- 使用框架来自动分析所有函数之间的调用关系,直观展示调用流程。
碎片化的函数难以开发和扩展
通过使用框架来提供单体应用式的开发体验。
为什么面向业务流程?
大部分情况下,业务人员的沟通用的是面向过程的表达方式,比如第一步做什么,第二步做什么等等。
而传统的技术框架,特别是 MVC 框架,用的是面向对象的表达方式。当翻译业务语言时,需要先构建抽象的对象,然后再构建该对象的行为。当流程复杂时,需要创建一系列的对象和行为。在一个高内聚的复杂应用内,这种抽象形式的确可以大幅简化开发和管理的难度。
但 FaaS 提供了完全解耦和独立的函数,使得我们可以以更贴近真实业务和人员结构的表达形式来组织代码。
为什么选择 Serverless?
什么是 Serverless?
如上图所示,Serverless 是指由服务商来完全托管服务底层的服务,托管对象可以是函数或者应用。
FaaS(Function as a Service)是专指 Serverless 服务中的函数服务,开发者上传函数后,由服务商来负责按需执行和横向扩容等事情。
当托管对象为应用时,我们一般称为 PaaS(Platform as a Service)。
Serverless 的优势
- 专注业务逻辑,由服务商全权托管底层和运维
- 自动伸缩,按使用量计费,节约成本
为什么选择 FaaS 而不是 PaaS ?
- PaaS 的应用通常基于各类 MVC 框架,有一定的学习成本和使用门槛
- PaaS 无法避开随着应用复杂度的提升,导致扩展成本急剧升高的问题
- FaaS 由于粒度细化到 Function 层级,重构时可以轻易找到最小切入点,进行低成本重构
- FaaS 的函数互相之间独立运行,极大的降低了单点故障的影响范围
- FaaS 可以提供更细粒度的自动伸缩和成本优化,并直观体现业务的使用频率等运营数据
- FaaS 可以极大降低多人同时开发一个应用时导致的代码冲突
为什么选择 Node.js ?
什么是 Node.js ?
Node.js 是一个能够在服务器端运行 JavaScript 的开放源代码、跨平台 JavaScript 运行环境。
Node.js 的优势
- JavaScript 是一个通行于前后端的编程语言,且易于上手
- Node.js 的插件管理工具 npm 已有近百万插件,易于使用和开发
为什么选择 TypeScript ?
什么是 TypeScript ?
TypeScript 是 JavaScript 的一个严格超集,并添加了可选的静态类型和基于类的面向对象编程。
Typescript 的优势
- 弥补 JavaScript 的缺陷
- 提升代码质量
- 开发时可以享有更好的代码提示及类型检查