首页 微博热点 正文

一个例子说明了Go应用程序的优雅暂停-必威betway_betway必威体育|首页

Go言语中文网,致力于每日共享编码常识,欢迎重视我,会有意想不到的收成!

0小本生意1 写在前面

依照一般的规划准则, 每个 HTTP 恳求都是无状白蛇传说态的,因而大多状况下 Web 运用都很简略做水平扩展。“无状况”也意味着 HTTP 恳求建议拌面重试的成本是很低的,然后使得 Web 接口的开发很少重视高雅间断(一部分也由于 Web 结构做了这部分的考虑)。

不过,事务中 ① 总会存在对间断比较灵敏的接口(比方付出相关),而且 ② 总会存在一些带状况的服务,此刻高雅间断就显得比较重要了。

本文经过一个Go 守时使命示例来简略介绍 Go 技能栈中高雅间断的处理思路。

02 适用人群

入门——初级√——中级——高档;本文习惯初级及以上。

03 代码级支撑高雅间断是必要的

高雅间断的意义

所谓“高雅间断”,是指运用接纳到特定的间断信号(比方 INT、TERM)后,不再承受外部的新恳求,也不再创立内部的新使命,坚持运用进程运转直到旧需求和旧使命履行完成后再停止退出。

Kubernete一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 s 中 Pod 的停止机制

作为高可一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 靠的服务渠道,k8s 界说了停止 Pod (事务进程在 Pod 中运转)的根本进程:当自动删去 pod 时,体系会在强制停止 Pod 之前将 TERM 信号发送到每个容器中的主进程,过一段时间后(默以为 30 秒),再把 KILL 信号发送到这些进程。除此之外, k8s 还经过钩子办法供给了对 容器生命周期 的办理才能,答运用户经过自界说的办法装备容器发动后或停止前履行的操作。

当打包进镜像的运用运转在 k8s 中的时七七候,假如运用完成了高雅间断的机制,就能够充分利用上面说到的 k8s 的才能,在晋级运用(发新版本)和办理 Pod (宿主机stepson保护时把 Pod 漂移到另一个宿主机,或许在闲时动态地缩短 Pod 数量然后把资源省出ordinary来另作他用)的进程中完成服务的零间断。

高雅间断的 Go 代码示例

下面的代码界说了两个守时使命:mySecondJobs 每秒钟会触发一次,每次持续约 牙槽骨杰出1 秒钟;myMinut郭起月教师eJobs 每分钟会触发一次,每次持续约 2 秒钟。详细地能够阅览下面的代码(能够直接仿制下面的代码到自己的环境中运转):

源s9码解读-高雅间断的处理思路

  1. 经过 signal.Notify 捕获特定的信号;
  2. 经过 for + select 来完成循环使命,一起检测上步中欲捕获的信号;
  3. 假如守时器被触发,则履行对应的使命;
  4. 假如发现收到了指定的信号,则跳出 for 循环,并采纳必定办法完毕异步使命。

源码解读-值得重视的几个应点

代码中选用了 go mySecondJobs() 和 go myMinuteJobs() 异步使命一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 的办法;假如选用同步的办法将无法捕获信号,由于此刻主线程在处理事务逻辑,没有闲暇处理信号捕获逻辑。

源码中偷闲地采纳简略等候的办法来确保异步使命正常完毕,非普适办法,实践开发中需求依据状况做定制。

time.Ticker 的运用是有留意事项的,当 select 语句中同一时刻有多个分支满意条件时会随机取一个履行,然后导致信息丢掉(参阅文献中最终一篇有讲到),不过本文的代码不会触发这个问题,我们能够考虑一下原因。

03 小结

默许状况下,Go 运用在接纳到 TERM 信号后直接退出主进程,假如此刻有进程没处理完(比方 接纳到外部恳求后没有回来呼应,或许内部的异步使命没有完毕),则会导致进程的异常间断,影响服务质量。经过在代出卖码中显式地捕获 TERM squirrel信号及其他信号,感知操作体系对进程剑南春酒的处理,能够自动采纳办法高雅地完毕运用进程。

跟着 k8s 的遍及,考虑到其对肾功能查看进程生命周期的标准化办理,运用支撑代码级的高雅间断(尤其是容器化的运用)有必要成为一种开发标准,值得引起每一位开发者的留意。

参阅

  • 信号(LINUX信号机制)_百一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 度百科 介绍 Linux 中的信号(比方 SIGINT、SIGTER为紫薇圣人起了一卦M 等)
  • Pods - Kubernetes Kubernetes 官网对 pod 的介绍,包括一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 对 pod 生命周期的介绍
  • Container Lifecycle Hooks - Kubernetes Kubernetes 官方一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 对容器生命周期中的钩子的介绍
  • 高雅地封闭kubernetes中的nginx - 简书 介绍了信号、 k8s 中 pod 的停止流程,以及 nginx 的高雅停止
  • golang信号signal的处理 - 高兴编程
  • Golang的 signal - 蝈蝈俊 - 博客园
  • os/si床上相片gnal: Prevent developers from catching SIGKILL and S嵩山IGSTOP Issue #9463 golang/go GitHub 云虞之欢Go一个比方说明晰Go运用程序的高雅暂停-必威betway_betway必威体育|主页 中不允连州气候许捕获 SIGKILL 和 SIGSTOP 信号
  • go里边select-case和time.Ticker的运用留意事项 - CSDN博客 尽管本文的示例不会触发,不过 time.Ticker 运用时仍是要留意一下这个小坑
  • how to get a graceful shutdown of an server. Issue #1329 gin-gonic/gin GitHub Go 的 Web 结构 Gin 对高雅间断的支撑示例

著作权归作者一切。

原文: https://jingwei.link/2019/03/31/golang-graceful-ending.html

相关推荐

  • 暂无相关文章