本文最初发布于goiabada博客,经原作者授权由InfoQ中文站翻译并分享。

\\

理想中的部署是小型、精简、易恢复、快速的,并且只能占据数据库较小的空间,甚至是零占据。然而,不管我们怎么努力,有时候都无法达到这些目标,你的部署最终是恰恰相反的,是大型、复杂、难恢复、痛苦且缓慢的,并且占据了很大一部分数据库空间。如果你要部署的是软件的关键部分,那就更糟糕了。

\\

但是实际上有更多方式,可以让这些情况变得更糟。下面这些点,如果你遵守了,就能保证部署就像一场噩梦,带来的后果会困扰你和你的同事好几天。

\\

1. 不制定计划

\\

\\

计划真是烦。它们要花时间和精力,也不给你的软件添加新的功能。要计划一次部署,需要考虑清楚部署的范围,更重要的是,要考虑清楚不应该部署的部分(指的是虽然不应该部署,但可能会部署到的内容)。好的部署计划需要简单明了地列出每个步骤,然后尽量将可能发生的问题也列举出来。制定部署计划的目的是在开始之前尽可能多地覆盖盲点。当然了,如果你的团队里有代码忍者、软件大师,或其他什么高级的人物,那你就不需要计划了,尽管随意发挥吧。

\\

2. 不规划停机

\\

停机也好烦,通常在奇怪的时间发生,比如说深夜或一大早,在客户睡着的时候发生(当然你也非常希望是这样的)。为什么要切断公开访问,将客户重定位到完美的“计划维护页面”?在和现场客户在对生产的交流中感到崩溃的时候,为什么还要给你和团队制定平缓、清晰的时间表呢?生产调试是最棒的调试!当你的团队在尝试修复上周五晚上已经修复过的bug时,给客户提供不一致的产品状况,把他们晾在一边让他们云里雾里试试?

\\

3. 摒弃好的日志系统

\\

只有错误不断的软件才需要日志,你的软件并不需要。为什么要花时间和金钱在登录即服务平台上(LaaS)?就让整个团队ssh进入生产环境,观察日志尾部。或更好的选择是用缓慢、不可靠、用户界面混乱的LaaS,这样在部署的时候所有人的工作都是在找bug。

\\

4. 丢掉错误跟踪器

\\

\\

看一下上面的图片,就像日志一样,错误跟踪器也很烦。相信自己不会有任何错误发生的是吧!在你的手中,绝对不会发生回归。而且,在你已经有日志的时候,谁还需要用强大、快速、可靠的错误跟踪平台来追踪异常?你拥有足够的能力,可以在任何异常出现的时候grep,妥妥搞定。

\\

5. 抛弃开发用服务器

\\

开发用服务器是对资源的浪费,它浪费时间又浪费金钱。要一个完全接近生产服务器的副本有什么用?有了它和开发环境还有什么区别?当然,容器化已经抽象出了其中许多区别,但你(最好)有和开发环境中不同的网络设置、第三方API和其他的东西,甚至是容器也好。所以我们要胆子大一些,实现从开发到生产的飞跃!

\\

6. 检查环境变量

\\

你的项目大概有80个访问令牌、API密钥、数据库证书以及缓存存储凭证,遍布在6个左右的YAML上。它们超级容易跟踪,超难弄乱你的生产、开发和开发用环境(希望有)。不要再三检查部署中已经变更的变量,你能避免几个小时的痛苦调试。

\\

7. 部署后的数据一致性

\\

在前面的步骤中,我们已经知道了在部署中客户依旧可以使用软件,所以在保证数据不一致性的道路上我们已经走了一半了。请保证不要让新的代码接触到数据库,特别是数据库结构本身。如果有问题发生,只要回复提交并回滚,这样你就不用担心不一致了。

\\

8. 别为后面的回滚做准备

\\

如果所有都失败了,额等等,这不会发生!在部署的时候可能会出现一些问题,但在完成之后我们就不需要回滚了,是吗?真的是吗?在所有事搞定之后,你制定了一个计划(其实你不需要制定计划,还记得吗?),按照计划一步步执行,一切顺利,你就不需要回滚。但假设在部署后几小时(或几天),你需要回到之前提交或标记或任何地方。新的数据可能需要你手动切换回之前软件版本可控的内容。别想,别计划,这不太可能发生。如果发生了,你需要一个夜深人静的夜晚,埋头苦干才能完成。累感不爱。

\\

9. 拒绝和团队高效地交流

\\

\\

现在你已经知道了,你要有可怕的日志和错误跟踪系统。雪上加霜的是不和同事进行快速、直接和清晰的交流。如果你的同事等待你的及时回复,你长时间不理他一定会有很戏剧性的效果。含糊地交代你在做的事情。点了回滚按钮,但不小心“忘记”告诉其他人。总而言之,越装傻越好。

\\

只要你好好遵守上面的所有点,你就可以造成“完美的风暴”,如果你不遵守它们,你和你的团队就能更容易地完成任务。但即使你有很好的部署时间,有时候情况也会突变。永远会有盲点存在,它们多半是不可预知的。这就是软件开发会遇到的情况,从它我们可以得出获得糟糕部署的第10点,也是最后一点:

\\

10. 如果所有事情都失败了,不要对你的同事有耐心,不要理解他们!

\\

本文作者

\\

\\

Leonardo Brito是Guava的Ruby开发人员。

\\\\\\

查看英文原文:10 ways not to do a big deploy

\\

感谢张婵对本文的审校。

10种避免大型部署的方法相关推荐

  1. Intellij IDEA 4种配置热部署的方法【转】【补】

    热加载 热加载可以使代码修改后无须重启服务器,就可以加载更改的代码.(其实分java和非java代码,本处可以让java代码立即生效且不重启服务) 第1种:修改服务器配置,使得IDEA窗口失去焦点时, ...

  2. 10种网站数据的采集方法

    10种AI训练数据采集工具排行榜 10种网站数据的采集方法 1.目前常用的10种网站数据 2.如何写Python爬虫: 3.人生第一个 爬虫代码示例: 另外: 10种网站数据的采集方法 如何收集网站数 ...

  3. 10种招聘数据的采集方法

    10种AI训练数据采集工具排行榜 10种招聘数据的采集方法 1.目前常用的10种数据网站 2.如何写Python爬虫: 3.人生第一个 爬虫代码示例: 另外: 10种招聘数据的采集方法 如何收集招聘数 ...

  4. 商家自建流量池:10种微信引流的方法,值得学习社群营销的商家收藏 !

    社群电商的客流量有两种:第一种叫自带流量,第二种叫自建流量.我们讲的内容营销或视频直播营销,往往属于前者自带流量,即少数的意见领袖.达人.网红.知名品牌.但对于大部分的企业和商家来说,自带流量非常不现 ...

  5. **10种常用的网络营销方法**

    **10种常用的网络营销方法** 网络营销产生于20世纪90年代,发展至今已演变出越来越多的营销方法,在国内随着互联网影响的进一步扩大,人们对网络营销认知的进一步加深,网络营销方法手段也是各种推陈出新 ...

  6. 10 ping不通widwos7 windwos_弱电老司机总结的10种视频监控系统故障解决方法,学会,事半功倍...

    最近有许多的读者咨询关于视频监控系统维修方法的事情,有没有总结一些常见故障的解决方案呢?当然有的,今天分享一些常见故障解决方法. 正文: 视频监控系统通常出现摄像机没有画面.或者画面卡顿.丢失等情况, ...

  7. 10种常用的网络营销方法

    网络营销产生于20世纪90年代,发展至今已演变出越来越多的营销方法,在国内随着互联网影响的进一步扩大,人们对网络营销认知的进一步加深,网络营销方法手段也是各种推陈出新,下面就介绍如今网络营销最常用的1 ...

  8. 详解10种解决启动故障的方法

    开机自检时出现问题后会出现各种各样的英文短句,短句中包含了非常重要的信息,读懂这些信息可以自己解决一些小问题,可是这些英文难倒了一部分朋友,下面是一些常见的BIOS短句的解释,大家可以参考一下. 1. ...

  9. Intellij IDEA 4种配置热部署的方法

    热加载 热加载可以使代码修改后无须重启服务器,就可以加载更改的代码.(其实分java和非java代码,本处可以让java代码立即生效且不重启服务) 第1种:修改服务器配置,使得IDEA窗口失去焦点时, ...

最新文章

  1. Pytorch的网络结构可视化(tensorboardX)(详细)
  2. 高分辨率、实时的手持物体360°三维模型重建结构光技术
  3. java7 离线_java7 64位
  4. 【Win 10应用开发】SplitView控件
  5. T-SQL and XML
  6. 使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组
  7. 顺丰gis产品经理_线上面试季丰图科技—顺丰旗下专注GIS领域
  8. 远程客户端连接MysqL数据库太慢解决方案
  9. 【大学生】做‘心机’大学生,深度高效挖掘有效人脉
  10. 论文笔记:语音情感识别(三)手工特征+CRNN
  11. ubuntu 8.10 可用的源
  12. Microsoft Office 2021 简体中文正式版下载
  13. matlab的做潮流计算,Matlab实现潮流计算程序
  14. Access update语句 提示 操作必须使用一个可更新的查询
  15. 学计算机科学与技术的考研方向,计算机科学与技术考研方向?
  16. unity再战PBR材质流程与材质制作实践
  17. 深度学习进行时间序列模式识别
  18. 什么是promise,promise的使用及实现
  19. boost::stacktrace::stacktrace相关的测试程序
  20. 生活随记 - 祝你生日快乐

热门文章

  1. ORU-10027: buffer overflow, limit of 10000 bytes
  2. ctype_digit()函数
  3. configparser模块
  4. Js面向对象和数据类型内存分配(转)
  5. ubuntu下编译安装PHP
  6. Android--PullToRefreshListView 的简单使用
  7. Linux下得到显示屏参数的方法
  8. javascript音频管理方案:SoundManager2
  9. 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)
  10. oracle 强制 断开,ORA-01092 ORACLE 实例终止。强制断开连接 解决方案(下)