无服务器 - 运行 Lambda 函数中的 Express 实例,好还是坏?
Serverless - Running an Express instance in a Lambda function, good or bad?
在学习无服务器框架时,我遇到了几个教程,展示了如何在 Lambda 中 运行 Express 实例。在我看来,这似乎有点矫枉过正,违背了 Lambda 函数的目的。
该方法通常涉及 运行在 Lambda 中设置一个 Express 实例并将 API 网关请求代理到 Express 路由器以进行内部处理。
对我来说,简单的方法是在 API 网关中创建一个 API,然后将各个请求路由到 Lambda 进行处理。我错过了什么吗?
考虑到 Lambdas 的执行时间是 15 分钟,就内存而言,仅仅启动 Express 实例是不是非常昂贵?此外,限制为 100 个并发 Lambda 执行会造成瓶颈,不是吗? EC2 实例不是更适合这种情况吗?像这样使用 Lambda 似乎有点矫枉过正。
我看到 运行在 Lambda 中使用 Express 实例的唯一两个好处是:
- 在迁移用 Express 编写的现有应用程序的情况下,允许将应用程序慢慢分解为 API 个网关端点。
- 路由的内部处理,而不是依赖于 API 网关 request/response 模型(代理到 Express 路由器)。
万一我遗漏了什么,这种方法有什么好处?
一些推广这种方法的资源:
你的大部分观点都是有效的,它确实可以称为 运行 Express 在 API 网关后面的 Lambda 函数中的反模式。
应该注意的是初始化时间并不是那么重要。虽然单个 invocation 的执行时间上限为 15 分钟,但单个 Lambda 实例在启动后将服务于多个请求。频繁调用的单个 Lambda 实例通常有 6 到 9 小时的生命周期,并在大约 30 分钟不活动时被处理掉。 (请注意,AWS 不会公开披露这些参数,这些数字只能用作一个大概值)。然而,无论谁是冷启动并吃掉初始化延迟的不幸者,都可能会得到数千毫秒的额外延迟。
正如您所说,这种方法的主要优势在于,它为现有 Node 开发人员提供了一条迁移路径,具有现有的 Express 知识和应用程序。从头开始开发应用程序时,您通常不应考虑这种方法,而应改为实施惯用的无服务器模式(例如,利用 API 网关路由)。
重申一下,这种方法的主要缺点:
- 由于放弃 API 网关功能(路由等)
,整体代码复杂性更高
- 较长的初始化时间导致较长的冷启动
- 由于依赖项更多,代码占用空间更大
- 由于丢失 tree shaking/由于内部路由而单独打包导致代码占用空间更大
P.S。如今的主要竞争者可能不是专用的 EC2 实例,而是 Node.js 中的 Fargate 容器 运行ning Express。此模式具有许多与无服务器相同的好处,同时保持现有开发模式和工具基本不变。
在学习无服务器框架时,我遇到了几个教程,展示了如何在 Lambda 中 运行 Express 实例。在我看来,这似乎有点矫枉过正,违背了 Lambda 函数的目的。
该方法通常涉及 运行在 Lambda 中设置一个 Express 实例并将 API 网关请求代理到 Express 路由器以进行内部处理。
对我来说,简单的方法是在 API 网关中创建一个 API,然后将各个请求路由到 Lambda 进行处理。我错过了什么吗?
考虑到 Lambdas 的执行时间是 15 分钟,就内存而言,仅仅启动 Express 实例是不是非常昂贵?此外,限制为 100 个并发 Lambda 执行会造成瓶颈,不是吗? EC2 实例不是更适合这种情况吗?像这样使用 Lambda 似乎有点矫枉过正。
我看到 运行在 Lambda 中使用 Express 实例的唯一两个好处是:
- 在迁移用 Express 编写的现有应用程序的情况下,允许将应用程序慢慢分解为 API 个网关端点。
- 路由的内部处理,而不是依赖于 API 网关 request/response 模型(代理到 Express 路由器)。
万一我遗漏了什么,这种方法有什么好处?
一些推广这种方法的资源:
你的大部分观点都是有效的,它确实可以称为 运行 Express 在 API 网关后面的 Lambda 函数中的反模式。
应该注意的是初始化时间并不是那么重要。虽然单个 invocation 的执行时间上限为 15 分钟,但单个 Lambda 实例在启动后将服务于多个请求。频繁调用的单个 Lambda 实例通常有 6 到 9 小时的生命周期,并在大约 30 分钟不活动时被处理掉。 (请注意,AWS 不会公开披露这些参数,这些数字只能用作一个大概值)。然而,无论谁是冷启动并吃掉初始化延迟的不幸者,都可能会得到数千毫秒的额外延迟。
正如您所说,这种方法的主要优势在于,它为现有 Node 开发人员提供了一条迁移路径,具有现有的 Express 知识和应用程序。从头开始开发应用程序时,您通常不应考虑这种方法,而应改为实施惯用的无服务器模式(例如,利用 API 网关路由)。
重申一下,这种方法的主要缺点:
- 由于放弃 API 网关功能(路由等) ,整体代码复杂性更高
- 较长的初始化时间导致较长的冷启动
- 由于依赖项更多,代码占用空间更大
- 由于丢失 tree shaking/由于内部路由而单独打包导致代码占用空间更大
P.S。如今的主要竞争者可能不是专用的 EC2 实例,而是 Node.js 中的 Fargate 容器 运行ning Express。此模式具有许多与无服务器相同的好处,同时保持现有开发模式和工具基本不变。