简介

按照一般的设计原则, 每个 HTTP 请求都是无状态的,因此大多情况下 Web 应用都很容易做水平扩展。“无状态”也意味着 HTTP 请求发起重试的成本是很低的,从而使得 Web 接口的开发很少关注优雅中止(一部分也因为 Web 框架做了这部分的考虑)。

不过,业务中 ① 总会存在对中止比较敏感的接口(比如支付相关),并且 ② 总会存在一些带状态的服务,此时优雅中止就显得比较重要了。

本文通过一个Go 定时任务示例来简单介绍 Go 技术栈中优雅中止的处理思路。

k8s中pod的终止机制

作为高可靠的服务平台,k8s 定义了终止 Pod (业务进程在 Pod 中运行)的基本步骤:当主动删除 pod 时,系统会在强制终止 Pod 之前将 TERM 信号发送到每个容器中的主进程,过一段时间后(默认为 30 秒),再把 KILL 信号发送到这些进程。除此之外, k8s 还通过钩子方法提供了对 容器生命周期 的管理能力,允许用户通过自定义的方式配置容器启动后或终止前执行的操作。

当打包进镜像的应用运行在 k8s 中的时候,如果应用实现了优雅中止的机制,就可以充分利用上面提到的 k8s 的能力,在升级应用(发新版本)和管理 Pod (宿主机维护时把 Pod 漂移到另一个宿主机,或者在闲时动态地收缩 Pod 数量从而把资源省出来另作他用)的过程中实现服务的零中断。

优雅中止的 Go 代码示例

下面的代码定义了两个定时任务:mySecondJobs 每秒钟会触发一次,每次持续约 1 秒钟;myMinuteJobs 每分钟会触发一次,每次持续约 2 秒钟。具体地可以阅读下面的代码(可以直接复制下面的代码到自己的环境中运行):

package mainimport ("fmt""os""os/signal""syscall""time"
)func main() {c := make(chan os.Signal)// Go 不允许监听 SIGKILL/SIGSTOP 信号// 参考 https://github.com/golang/go/issues/9463signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)second := time.NewTicker(time.Second)minute := time.NewTicker(time.Minute)A: // 由于 for-select 嵌套使用,设置跳出 for 循环的标记for {select {case s := <-c:// 收到 SIGTERM/SIGINT 信号,跳出 for 循环结束进程fmt.Printf("get signal %s, graceful ending...\n", s)break Acase <-second.C:go mySecondJobs()case <-minute.C:go myMinuteJobs()}}fmt.Println("graceful ending")// 做一些操作让异步任务正常结束,这里偷懒地采取简单等待的方式 												

golang中的优雅中止相关推荐

  1. exec go 重启_[译]Golang中的优雅重启

    声明:本文目的仅仅作为个人mark,所以在翻译的过程中参杂了自己的思想甚至改变了部分内容,其中有下划线的文字为译者添加.但由于译者水平有限,所写文字或者代码可能会误导读者,如发现文章有问题,请尽快告知 ...

  2. Linux Signal及Golang中的信号处理

    转载地址:https://colobu.com/2015/10/09/Linux-Signals/ 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方 ...

  3. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  4. golang集锦——如此优雅-吴冬冬-专题视频课程

    golang集锦--如此优雅-534人已学习 课程介绍         这段教程假设你已经懂了golang的基础知识了,想学点好玩的东西,还有golang使用过程中必须要学的一些功能组件. 课程收益 ...

  5. Golang信号处理和优雅退出守护进程

    Golang中的信号处理 信号类型 个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令 man signal 提供了官方的信号介绍. ...

  6. Golang中panic与recover的实现原理

    今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...

  7. Functional Options: Go中实现优雅的API的方法 | Gopher Daily (2021.10.22)

    每日一谚:学会不要马上增加太多的功能,要把核心思想建立起来并进行测试 - Leah Culver Go技术生态 Go很大可能在go 1.19版本中支持编译器的FGO(feedback-guided o ...

  8. go每日新闻(2021-02-05)——Golang 中 nil==nil 是对是错?

    每日一谚: Go对OO提供了另类的支持:有方法(method)无类(class),有接口(interface)但无类型体系,代码可重用,但不通过继承的方式. go中文网每日资讯–2021-02-05 ...

  9. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

最新文章

  1. 一个div 上下两行_用 Python 撸一个 Web 服务器第4章:动态渲染数据
  2. 一篇文章彻底说清JS的深拷贝/浅拷贝
  3. N元语法模型的数据稀疏问题解决方法之一:Good-Turing平滑
  4. SQL 在表中建立索引的作用
  5. [极客大挑战 2019]EasySQL
  6. 程序员进入BAT,到底是“好事”还是“坏事”?
  7. durpal是否支持php7,php – 无法在drupal 7中添加图像字段
  8. php使用Yar实现RPC调用
  9. android apk安装工具,安卓装机必备工具!一键批量安装应用apk
  10. 机器学习关键步骤(四)
  11. 常用的web服务器软件整理
  12. OS1和OS2单模光纤的区别
  13. 『AidLux工业检测PaaS平台』轻松解决AI工业质检换产难问题!
  14. Ethereum-ERC721智能合约和Dapp实践--以太猫CryptoKitties的简单实现
  15. Linux简介及在VMware上安装第一台虚拟机
  16. Listio官网教程
  17. 2021年危险化学品经营单位安全管理人员模拟考试及危险化学品经营单位安全管理人员证考试
  18. SQL 开发的十个高级概念
  19. 考研一看书就犯困,怎么破?
  20. 货币基金和银行理财的区别

热门文章

  1. 【错误记录】Flutter 组件报错 ( No Directionality widget found. | RichText widgets require a Directionality )
  2. 【计算理论】计算复杂性 ( 无向图独立集问题 | 独立集问题是 NP 完全问题证明思路 | 证明独立集问题是 NP 完全问题 )
  3. 【组合数学】排列组合 ( 多重集组合数示例 | 三个计数模型 | 选取问题 | 多重集组合问题 | 不定方程非负整数解问题 )
  4. 【Java 网络编程】Socket TCP UDP 联系
  5. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
  6. 虚拟机VM三种网络连接方式说明
  7. 初学jQuery之jQuery虚假购物车-------与真实数据无关
  8. bzoj1196 [HNOI2006]公路修建问题
  9. (转)Linux grep
  10. java包的命名规则技巧