PM2 - NestJS 多个实例

问题描述 投票:0回答:2

我有一个 NestJS 应用程序。我习惯于在集群模式下使用 PM2 部署 NodeJS 应用程序(多个实例运行)。

NestJS 的服务使用 Singleton 模式。我的一些功能依赖于此功能(使用可以全局访问并保持其值的服务属性)。

使用 PM2 集群模式会遇到问题吗? NestJS可以通过实例共享这个Singleton吗?

Obs:我不想增加项目的复杂性。例如,安装 Redis 来保存全局数据。

javascript typescript nestjs pm2
2个回答
0
投票

是的,如果您依赖单例模式来实现全局状态,则在使用 PM2 集群模式和 NestJS 时可能会遇到问题。在集群模式下,应用程序的每个实例都在自己的进程中运行。 NestJS 中的单例范围仅限于每个应用程序实例,因此它们不会在 PM2 集群中的不同实例之间共享状态。每个实例都将拥有其任何单例服务的独立版本,这意味着这些服务中保存的任何全局状态都不会在集群实例之间同步。

要跨集群实例处理全局状态而不添加 Redis 等外部依赖项,请考虑使用共享数据库或文件系统进行状态持久化。通过从所有实例都可以访问的公共数据库或文件中存储和检索共享状态,您可以确保 PM2 集群中不同实例之间的一致性。然而,这种方法可能会带来与数据同步和性能相关的复杂性


0
投票

在 PM2 的集群环境中,每个集群实例作为单独的进程运行,并且它们不直接共享内存。 由于 NestJS 服务是单个进程中的单例,因此在实例之间共享数据并不简单。

如果您依赖于单个 NestJS 实例中的单例服务,则在使用 PM2 集群模式时可能会遇到问题,因为每个实例都是独立运行的,一个实例中的更改不会反映在其他实例中。

为了在不增加外部复杂性的情况下解决这个问题,您可以考虑在 NestJS 应用程序中使用内存缓存。例如,您可以使用像

memory-cache
这样的缓存库或 NestJS 提供的内置
CacheModule
。 这允许您在同一实例内的请求之间共享一些数据。

让我知道这是否有帮助,我也会尝试使用一些代码进行更新。

© www.soinside.com 2019 - 2024. All rights reserved.