传统重启弊端:

后台上线功能,以往的做法是当有对代码进行更改,需要将新代码提供给用户时,将uwsgi服务器重新启动以使更改生效,但这个重启过程会将所有uwsgi的worker进程强行kill掉,然后再重新启动这些worker,导致的结果:

  • worker正在处理的请求无法正常处理完,
  • 重启过程中uwsgi无法正常接收请求,请求报502的错误,特别是由于某些原因重启时间可能很久

从stop uwsgi到start uwsgi需要一定时间,这期间就损害了用户的体验:

  1. 在网站上看到服务不可用的错误
  2. 在请求处理中用户等待很久
  3. 服务重启遇到程序bug,导致重启失败

优雅重启过程:

优雅的重启是一门艺术,优雅重启的方式有多种,但经过测试,链式重启是最优选择之一,且实现起来非常方便

链式重启的实现过程是一个接一个工人依次重新加载启动,直到所有工人都重新加载完毕。比如你有五个工人,工人A,工人B,工人C...,当你触发链式重启时:

  • 若工人A此刻正在处理请求,链式重启允许它完成此次请求,工人A开始重新加载最新代码
  • 如果工人A顺利完成加载,此时工人A接收到的请求都由最新代码处理,而其他4个工人则依然运行旧代码
  • 工人A顺利完成加载后,依次由工人B开始重新加载最新代码,重复此操作,直到每个工人都获取新代码。链式重启过程完成
  • 如果前一个工人没有加载成功,那么后一个工人也不会进行重启加载,这就意味着,如果程序有bug,其他工人都不会受到任何影响,依然能正常接收请求,这点非常棒,与传统野蛮重启方式相比有明显优势

优雅重启实现:

链式重启的实现非常简单,是通过touch一个文件来触发优雅重启过程:

  1. 打开uwsgi的以.ini后缀的配置文件,添加这一行:

    lazy-apps = true

    这里的lazy-apps是uwsgi的其中一种加载模式,不指定的话,默认情况下,uwsgi在第一个进程中加载整个应用程序,在加载应用程序之后,它会多次fork本身,这种方式虽然能减少应用程序的内存使用,但它是对整个堆栈进行了重新加载,比较野蛮,而不是单独对每一个工人重新加载。而lazy-apps模式会为每个工人加载应用程序一次。假设它的工人数是n,那么它的时间复杂度就是O(n),这样可能会消耗更多的内存,但这种确保了服务一直处于可用状态,不至于停机,这也是我们第二部分重启过程的思路,每个工人都重新加载,而默认的模式做不到这一点,所以想要做到优雅重启,需要将uwsgi默认设置为lazy-apps

  2. 指定touch-reload-chain的文件

    touch-chain-reload = /home/ymserver/demeter/master/backend/website/demeter/settings.py

    这个指定一个链式重启的touch文件,每次touch这个文件来触发优雅重启过程,无论何时更新代码,只需touch settings.py即可。如果跟踪uwsgi日志,您可以看到uwsgi如何执行此过程。以下是我实操的截图,我这里有8个工人在跑,

总结:

  • 优点:

    • 保证上线过程服务高可用,提升用户体验
    • 若新代码油污导致重启失败的,不会影响其他工人运行
  • 缺点:
    • 仅对代码更新有用
    • 占用较大内存
    • 需要增加一些工人来做逐个重启

uwsgi graceful reload相关推荐

  1. Centos7.x快速配置Django+Nginx+Uwsgi服务

    大家好,我是Mr数据杨.今天,将和大家分享如何构建一个完善的服务器环境.折磨了我2天,终于自己调试成功Django+nginx+uwsgi的服务,直接上流程按照这个流程100%能成功,就算你啥也不懂看 ...

  2. pm2常用的命令用法介绍

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧 ...

  3. [最全操作指南] 在线六个项目全部迁移Linux

    (书山有路勤为径,学海无涯苦作舟) 开源也两年了,没想到自己在宣传.NetCore全栈的时候,也慢慢的做出了几个产品,毕竟也是一行一行的敲出来的,也是一天一夜的改出来的,希望每个人都能在自己学习中培养 ...

  4. ubuntu搭建nodejs生产环境——快速部署手册

    为什么不用CentOS而用Ubuntu作为生产环境的运行平台?这个我也比较好奇,公司订的只能沿用传统,从使用成本的角度来说,此举也是值得肯定的. 测试环境 腾讯云 Ubuntu 16.04 阿里云 U ...

  5. exec go 重启_如何用 Go 实现热重启

    热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务. 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socke ...

  6. PM2怎么保持Node应用程序永久活动?

    官网介绍: PM2是守护进程管理器,它将帮助您管理和保持应用程序在线.PM2入门非常简单,它是一个简单直观的CLI,可以通过NPM安装. PM2是Node.js应用程序的生产流程管理器,内置负载均衡. ...

  7. NuxtJS 项目部署如何部署到nginx

    NuxtJS 项目完成之后,如何部署到nginx? 总流程:Nuxtjs打包---->服务器上部署运行---->nginx监听---->PM2进程守护 提示:安装nginx (我目前 ...

  8. 使用pm2来保证Spring Boot应用稳定运行

    使用pm2来保证Spring Boot应用稳定运行 原作者:dulingyulove  原文链接:https://www.bbsmax.com/A/KE5QmgZ35L/ Spring Boot开发w ...

  9. 从零搭建个人网站服务器

    准备前提 服务器(以阿里云的轻量应用服务器为列) 已经开发好的网站 服务器简介 内存:2G CPU:2核 系统盘:60G 系统镜像:CentOs 已经预安装了PHP 与 Mysql 环境安装 1. n ...

  10. go walk 开发window界面,上传文件到阿里云oss -- 服务器端

    前面我们完成了一个网页端的上传oss程序:https://blog.csdn.net/daily886/article/details/103366145 现在我们把前后端分离 前端使用walk开发, ...

最新文章

  1. IE浏览器加载CSS文件,但是不起作用的原因
  2. 动态SQL字符长度超过8000
  3. android 保存退出之前的页面_项目实战:Qt+Android模拟操作器(模拟操作app,打开,点击,输入,获取验证码等等)...
  4. 基于ZYNQ的机器视觉应用实例
  5. 如何使用 React 创建一个作品集网站
  6. C++设计模式-备忘录模式
  7. 【周记:距gdoi43天】
  8. 物联网与人工智能之间的区别与联系
  9. 最后一个页面:构建电影详情页面
  10. shell中判断一个参数是否为整型
  11. 有shi以来最详细的正则表达式入门教程
  12. 动态添加gridview行【转:http://www.cnblogs.com/oec2003/articles/1069796.html】
  13. 搭建离线版keras中文文档
  14. 计算机审计实验一计划阶段,审计实验1.ppt
  15. python:实现newton_raphson牛顿拉夫森算法(附完整源码)
  16. bryntum Kanban Task Board 5.1.0 JS 看板
  17. Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?Doctype文档类型?
  18. 序贯蒙特卡洛的粒子简并性问题
  19. VSCode PlatformIO IDE 下开发ESP32遇到的问题
  20. 2022年湖南省中医执业医师考试第二单元中医诊断学(四)

热门文章

  1. python 从入门到精通——多任务、多线程编程
  2. 达梦数据库解决ZYJ环境数据库连接会闪断的问题
  3. 论文阅读-A Fast Learning Algorithm for Deep Belief Nets
  4. CSS外边距塌陷问题,吊打面试官
  5. 奶酪和奶酪碎的区别_与奶酪三星银河芽战斗大逃杀直播vs airpods
  6. linux QT 结束当前进程_Qt与Web混合开发(一)--简单使用
  7. 【测试用例练习】十、微信朋友圈点赞 和发红包 测试用例
  8. 有没有免费又好用的云桌面系统?
  9. dell t320 raid linux,Dell T320服务器阵列卡驱动下载
  10. 一本书读懂大数据 读书笔记(1)