NestJS适用于Firebase函数:启动时间是否适用于生产环境?

3

有很多关于如何使用nestjs设置firebase函数的文章,我已经在本地机器上开发了一个月。最终,是时候发布了。我使用nestjs和mikro orm的组合来处理我的服务器和数据库层,共有12个实体和约20个路由。在本地一切都运行得很顺畅。

然而,在firebase函数环境(默认情况下)中,您只有256mb的RAM和不知道多少vCPU,突然间我的冷启动+大约30秒的nestjs自旋转,意味着它不再是一个生产就绪的环境。相比之下,express的自旋转时间约为500ms+冷启动时间。

以下是一些日志截图,显示每个步骤所需的时间:

enter image description here

enter image description here

我是否设计了错误的应用程序或者Nest在小型环境中真的很慢?我无法想象懒加载会有所帮助,而且我正在为mikro orm自动发现实体。有什么方法可以尝试加速这个过程,或者有没有人在firebase函数中使用nestjs的经验?

1
嗨@plusheen,这只发生在冷启动时吗?您可以请查看最佳实践:性能以及这个线程,看看是否有所帮助。 - Marc Anthony B
关于ORM,你应该启用调试模式以查看发现需要多长时间,这些日志都来自巢DI,它们可能与ORM无关,而是与巢DI的工作方式有关。如果发现需要太多时间,可以使用元数据缓存,可以通过CLI在构建时预热。我还记得有人在将驱动程序类传递给ORM配置而不是类型时获得了速度提升,因此,您可以使用driver: SqliteDriver而不是type: 'sqlite' - 这样就不会有任何慢速的动态导入。 - Martin Adámek
关于实体的自动发现,我可以想象这也会增加ORM引导的一些不必要的时间。使用实体引用(entities:[Author,Book,...])始终是最快的。 - Martin Adámek
感谢您的回复@MartinAdámek。我会尝试这些方法,看看它们对性能的影响。调试模式目前已经开启,但由于颜色格式化的原因,很难看到,但实体发现只花费了42毫秒。当我使用全局发现时,它需要20-30秒左右,然后在使用自动发现时大大减少。 - plusheen
@MarcAnthonyB 是的,这只发生在冷启动时。Nest必须执行所有路由发现和DI魔法,这比express的开销要大得多。我认为不可能进行懒加载,因为它需要导入所有内容以进行路由发现。 - plusheen
1个回答

0

NestJS在优化冷启动环境下的服务方面有一个指南。那可能是一个好的起点。

对于任何需要在冷启动时进行大量设置工作的情况(例如您正在经历的30秒NestJS启动),minInstances选项可能值得使用。它允许您保持最少数量的实例处于“热”状态,以降低终端用户遇到冷启动的几率。

您还可以尝试使用memory选项调整函数可用的内存量(更多的内存也会给您带来更多的CPU)。


1
谢谢回复。我很谨慎地保持容器的运行或增加内存,因为这只是一个简单的副业项目,不想为这个项目付费。我的当前Express实现运行良好,所以如果我不得不开始付费,感觉就像降级了一样。不过我之前没有看到无服务器指南,所以至少我会尝试一下。如果我有任何成功的经验,我会回来标记这个答案。 - plusheen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接