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