总结

  1. k8s设置关闭前等待时间(保证服务被service剔除掉,取决于集群大小等因素)
  2. docker 运行pm2用 CMD ["pm2-runtime", "ecosystem.config.js"]
  3. k8s执行关闭,调用docker关闭接口传递信号
  4. docker向程序传递关闭信号,pm2会自动传递关闭信号到程序(pm2 关闭信号也有一个timeout时长设置和默认值吧,关注一下)
  5. nest 注册关闭 hook,类中监听关闭事件然后处理
    1. typeorm设置 name(不然关闭时候会报错)
    2. bull队列,或者其他数据源、连接、业务逻辑处理关闭
      1. 举一个case,限制用户并发数用mysql count出来,如果关闭的时候异常了(几乎很小很小的概率)那么用户限制就存在了,可能就会有问题了,解决方法就是定期去扫表,修复这种情况带来的异常问题;另一个解决方法就是用redis做计数(很小的概率也要考虑到),设置ttl超时事件
  6. 一切正常关闭,或者等到pod关闭超时kil掉

流程

优雅关机

一次优雅的关机,你的应用必须经过5个步骤:

Nestjs

NestJS 中文文档 | NestJS - 一个渐进式的 Node.js 框架

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
	// 加入这个
  // Starts listening for shutdown hooks
  app.enableShutdownHooks();

  await app.listen(3000);
}
bootstrap();