🗒️优雅关闭k8s pod docker pm2 nestjs bull

type
status
slug
date
summary
tags
category
password
icon

总结

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

流程

一次优雅的关机,你的应用必须经过5个步骤:
  • 收到stop的通知
  • 请求负载均衡器不再接收请求
  • 完成所有正在进行的请求
  • 释放所有资源(数据库,队列 …)
  • 退出

Nestjs

当应用接收到终止信号时,它将调用任何已注册的 onModuleDestroy()beforeApplicationShutdown(),然后是 onApplicationShutdown() 方法(按上述顺序),并将相应的信号作为第一个参数。 如果注册的函数等待异步调用(返回 promise),Nest 将不会继续序列,直到 promise 被解决或拒绝。

node Bull

pm2

当容器收到关闭信号时,PM2 会将此信号转发到您的应用程序,允许关闭所有数据库连接,等待所有查询已处理完毕或任何其他最终处理已完成,然后才能成功正常关闭。——不用特殊处理,直接用就好

k8s

(1)PreStop Hook:
  • 在Pod的定义中,可以配置一个PreStop Hook。这是一个在容器接收到SIGTERM信号之前执行的命令或HTTP请求。PreStop Hook允许容器在接收到SIGTERM信号前,有一段缓冲时间来执行清理工作,如关闭数据库连接、保存文件、通知其他系统等。
(2)SIGTERM信号:
  • 在PreStop Hook执行完毕后或未定义PreStop Hook的情况下,kubelet 会遍历 Pod 中 container, 然后调用 cri 接口中 StopContainer 方法对 Pod 中的所有 container 进行优雅关停,向 dockerd 发送 stop -t 指令,用 SIGTERM 信号以通知容器内应用进程开始优雅停止。
  • 等待容器内应用进程完全停止,如果容器在 gracePeriod 执行时间内还未完全停止,就发送 SIGKILL 信号强制杀死应用进程(容器运行时处理)。
(3)SIGKILL信号与资源清理:如果容器在宽限期后仍在运行,容器运行时会发送 SIGKILL 信号强制终止容器,并随后清理 Pod 的资源(容器运行时处理)。
Pod生命周期|服务质量
 
Docker 退出信号

typeorm异常|Closing a NestJS app with multiple datasources

Closing a NestJS app with multiple datasources
Updated Mar 1, 2024

测试方法

上一篇
class-validator nestjs dto参数校验
下一篇
NestJs bull 用法
Loading...
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP