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

type
status
slug
date
tags
summary
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...
文章列表
王小扬博客
云原生
Git
Elasticsearch
Apollo
产品
Think
生活技巧
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP
AI