3

我使用 Spring Cloud Function 创建了一个 AWS lamnda,但我认为执行 lambda 时这种方法很慢。

我的 lambda 非常简单,它只将一个对象保存到数据库中。

对另一种语言或框架使用 Spring Boot Function 是个好主意?

例如使用 phyton、nodejs 或其他解决方案。

4

2 回答 2

7

这是一个很难简短回答的问题。

冷启动

Spring Cloud Functions 和 Spring 框架的缺点是,其固有的依赖注入机制在启动时会很快花费相当长的时间。Spring 框架的某些流行部分自然需要一些时间才能启动:数据库连接、MQ 上的消息传递等。

再加上与更轻量级的环境相比,JVM 通常需要更多时间来启动这一事实,如果您需要或想要避免几秒钟的冷启动,人们会说 Java 不是最佳选择。根据我的经验,当您开始投资 Lambda 时,冷启动通常会给您带来最大的打击,因为那时您通常会有小的非连续工作负载,因此您的函数会定期从内存中被逐出,从而导致您的用户还将定期经历冷启动。

根据我的经验,我建议对直接与用户交互的函数使用更轻量级的运行时环境。这意味着基本上所有响应 HTTP 调用的代码都应该采用 JavaScript/TypeScript/NodsJS 或 Python 之类的技术。

所以在你上面描述的情况下,绝对是的。尝试使用除 Java 之外的其他技术。

我的 lambda 非常简单,它只将一个对象保存到数据库中。

我的代码库中确实有许多具有类似功能的功能,这些功能通常会在亚秒级的时间内冷启动,并且在预热状态下需要不到 100 毫秒的时间。

建筑学

一般来说,一旦无服务器应用程序发展起来,像 Spring Cloud Functions 这样的框架仍然是工具带中非常重要的工具。通常,一旦您涉足无服务器和 Lambda,您就会发现在 AWS 之上使用托管服务非常简单且有用:数据库、消息队列、电子邮件、S3 对象存储等。

然后很明显,应用程序能够被事件驱动,并且实际上引发了许多其他事件,但这些事件是由用户通过 HTTP 调用直接触发的。例如,在我的一个应用程序中,用户可以执行以下操作:

  • 上传文件并在这些文件上触发病毒扫描
  • 将消息推送到消息队列并生成 PDF 报告

对于上面提到的用例,我已经有了 Java 代码。更具体地说是在春天。因此,仅在 Spring Cloud Function 中重用此代码,但将这些运行时间较长的任务与用户 HTTP 请求分离是完全有意义的。它们可以在后台异步运行,突然间冷启动场景不再那么重要了。

一个报告本身需要 15 秒才能生成,对于个人用户来说,如果不时需要 18 秒,这真的不是什么大问题。

于 2020-09-30T07:50:54.170 回答
1

请参阅 Amazon 的最佳实践文档。 https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html

最小化依赖项的复杂性。更喜欢在执行上下文启动时快速加载的更简单的框架。例如,更喜欢更简单的 Java 依赖注入 (IoC) 框架,如 Dagger 或 Guice,而不是更复杂的框架,如 Spring Framework。

尽管 Spring 解决了很多开发人员的头痛问题,但它带来了很多包袱,并且占用了 Lambda 执行时间。

于 2020-04-28T00:49:14.580 回答