Nestjs的优雅关闭:确保平稳的应用终止
#javascript #typescript #node #nestjs

优雅的关闭是以受控和有序的方式关闭Web应用程序的过程,以确保所有过程均被安全终止并关闭所有连接。这对于Web应用程序很重要,因为它有助于防止数据丢失和损坏,并确保用户不会剩下不完整或失败的请求。在这篇博客文章中,我们将深入研究优雅关闭的概念,并学习如何在Nestjs应用程序中实现它。

让我们开始吧! ð

为什么我们需要服务服务器的优雅关闭

优雅的关闭是必不可少的,例如:

  • 部署新版本:确保在版本更新期间数据完整性和用户体验。

  • 缩放操作:避免扩展或向下缩放时数据不一致。

  • 零停机时间:保持更新期间的可用性。

  • 资源清理:关闭之前正确释放资源。

  • 长期运行过程:允许在关闭之前完成持续的任务。

  • 背景任务:确保背景过程正确完成。

  • 服务器故障:处理服务器失败期间的关闭以防止数据丢失。

  • 增强用户体验:保持用户的可靠性和信任。

为Nestjs应用程序实施优雅的关闭

要在应用程序中实现优美的关闭,您需要捕获关闭信号并创建一个函数,通过执行诸如停止新请求,完成持续的请求或任务以及清理资源等任务来响应它。在Nestjs的背景下,您可以使用enableShutdownHooks()方法以及onModuleDestroybeforeApplicationShutdownonApplicationShutdown等生命周期事件有效地处理关闭序列。这些机制使您可以响应特定的关闭信号并执行操作,例如关闭数据库连接并在应用程序关闭时发布资源。

这是有关如何实现此目的的指南:

考虑以下代码:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableShutdownHooks(); // Enable listening for shutdown hooks

  await app.listen(3000);

  // For illustration purposes, delay the shutdown
  setTimeout(() => {
    process.kill(process.pid, 'SIGTERM');
  }, 5000);
}
bootstrap();

如果您已经为NodeJS应用程序或ExpressJS(例如ExpressJS)实现了优雅的关闭,您可能已经注意到,您需要从本机节点服务器实例调用server.close()方法以阻止服务器在维护时接受新连接现有的。但是,由于keep-alive连接或反应迟钝的请求,它可能无限期地导致服务器悬挂。使用enableShutdownHooks()方法,此问题也可能发生在Nestjs应用程序中。要正确关闭服务器,您必须跟踪所有连接的创建并自行终止它们。为此,您可以使用npm上可用的nestjs-graceful-shutdown软件包,这简化了Nestjs应用程序的优雅关闭过程。

这是您可以集成的方式:

  • 将模块导入您的root AppModule
import { GracefulShutdownModule } from 'nestjs-graceful-shutdown';

@Module({
  imports: [
    GracefulShutdownModule.forRoot({
      cleanup: async (app) => {
        // releasing resources
        const myService = app.get(MyService);
        await myService.close();
      },
    })
  ],
  ...
})
class AppModule {}
  • 通过调用setupGracefulShutdown(...)函数来设置优雅的关闭:
import { setupGracefulShutdown } from 'nestjs-graceful-shutdown';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // Additional configuration for your NestJS app

  setupGracefulShutdown({ app });

  await app.listen(3000);

  // For illustration purposes, delay the shutdown
  setTimeout(() => {
    process.kill(process.pid, 'SIGTERM');
  }, 5000);
}
bootstrap();

nestjs-graceful-shutdown软件包还提供了配置选项,以在关闭服务器之前管理资源清理。有关更多详细信息,请参阅documentation

结论

总而言之,在Nestjs实施优雅的关闭对于确保受控和有序的关闭过程至关重要。通过遵循这些步骤并使用nestjs-graceful-shutdown软件包,您可以无缝管理关闭事件并在关闭过程中防止中断。

快乐黑客! ð