每日变更的最佳实践

2024-01-24

图片

图片

在优维公司内部,我们采用发布单的方式进行每天的应用变更管理,这里给各位介绍优维的最佳实践。

变更是需要多角色合作的,而且他是整体研发流程的一部分。在优维内部,我们坚持每日变更,打通开发环节到最终发布上线的全过程,在保证质量的前提下,尽可能提升需求交付速率,如下是我们的简要流程图:

图片

其中最右侧【发布单】就是用EasyOps产品的【双态部署 - 发布单】来实现的。发布单用于记录应用程序的更改,包括:

  • 变更的内容

  • 变更的顺序

  • 影响的范围

  • 变更的结果

  • 操作的人

  • 操作的开始时间和耗时

这种标准变更方案有助于保证每日变更过程的有序可靠及高效。同时优维内部也把发布单的创建跟提测单对接起来,做到了全流程自动化。

大伙知道,发布绝不仅仅只是程序包版本的变化,他包括发布前的各种准备,部署过程以及部署之后的线上检查等。基于此考虑,我们的日常发布单是由升级前、升级、升级后三部分组成,如下是产品截图的全貌:

图片

升级前

1.发送升级通知
升级前通知各同事环境开始升级,避免升级过程中影响到环境的使用,这里使用的是调用钉钉机器人给各个关系群发送消息,客户可以根据实际情况采用不同通知方式.
在一些对客系统中,经常需要进行系统维护或升级的情况下,我们会考虑挂维护页面,以避免客户访问页面时出现报错或其他不良体验.
通过挂维护页面,我们可以向用户提供一些相关的信息,如维护的时间范围、维护目的以及预计恢复时间等。这样可以增加透明度,让用户了解系统维护的原因和进展。此外,维护页面还可以提供一些联系方式,以便用户在有需要时能够与系统管理员或客服人员进行沟通和交流。

这些都可以在发布单的前置动作去灵活配置

2.设置监控维护期
这步骤内部没有设置,我们想清楚的看到升级过程中监控是否能够监控到服务的变化,实际使用时建议配置上,避免升级过程中收到误报.

升级

优维内部总共将近400个组件,每日变更的组件平均有20+,最多时候有50来个。组件之间有些是有部署依赖,有顺序要求,在如此庞大的组件清单里面我们如何去解决这个部署依赖的问题?对此,我们设立了一些标准:

  • 对组件进行分层(runtime -> runtime_db -> model_resource -> logic -> logic_db -> L1 -> L2 -> L3 -> xxx),层与层之间是串行部署的

  • 将所有组件归属到具体层级中,下层组件可以对上层组件有依赖,但同层组件不允许有依赖(如logic层的logic_x组件可以对runtime层的runtime_x有依赖)

  • 不同层有自己的并发部署设置,并发限定为1(串行)肯定是最为可靠和有序的,但他带来的是部署时长的增加,故我们需要依据不同层的特性,在保证稳定的前提下,尽可能提升部署效率

这里简单介绍几个重要的层:

model_resource(数据组件)
这里主要放置了数据组件,他主要负责表结构的变更,我们要求我们的表结构是不能做破坏性变更的,故把他放在第一步,在升级过程中,即使表结构发生的变化,但逻辑组件应该也是能正常运行的。同时我们也会有专门的数据割接组件(logic_db层),如果有数据割接,就会在后续执行。

因为表结构的变更是非常严谨的,故在这个阶段我们采用串行执行的方式。
虽然串行执行的方式可能会导致导入模型的时间变长,但它可以有效地控制数据库的负载,确保系统的稳定性和可靠性。

逻辑组件(logic)
逻辑组件可以被理解为无状态应用,它们之间相互独立,没有依赖关系。由于这种独立性,我们可以采用并发执行的方式来提高发布速度,当前并行度我们设置为3。
通过并发执行逻辑组件,我们可以同时处理多个组件的发布任务,而不需要按照严格的顺序逐个执行。这样可以显著提高发布的速度和效率。每个逻辑组件都可以在独立的线程或进程中执行,充分利用多核处理器和分布式计算资源,以实现并行处理。

前端组件(L5)
优维微应用是前端组件,同样是无状态组件,但在某些情况下可能会依赖于后端逻辑组件。针对这种情况,我们将微应用的处理与逻辑组件分开,分成前后两个阶段进行处理。
在本阶段, 我们并发执行微应用的变更,当前并行度我们同样设置为3。

升级后

升级后我们会做一些升级后的通知和检查工作,包括:

1.发送升级完成通知
通知各同事环境已就绪,可以正常使用,同时做一些人工验证。

2.触发自动化冒烟
在升级后的环境中,通过自动化测试可以快速执行一系列测试用例,验证系统在升级后是否正常运行,是否满足预期的功能和性能要求。

3.计算升级过程中平台可用性
计算升级过程中平台可用性,用于评估升级对客户的影响,后续分析如何进一步优化缩小对客户的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日变更的最佳实践 的相关文章

  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D
  • 【UE】在控件蓝图中通过时间轴控制材质参数变化

    效果 步骤 1 新建一个控件蓝图和一个材质 2 打开材质 设置材质域为用户界面 混合模式设置为 半透明 在材质图表中添加两个参数来控制材质的颜色和不透明度 3 对材质创建材质实例 4 打开控件蓝图 在画布面板中添加一个图像控件 将刚才创建的
  • 案例研究:YGG 如何通过 GAP 帮助 Pixels 扩大玩家群体

    在 Sky Mavis 联合创始人 Jeffrey Jihoz Zirlin 在 YGG Web3 游戏峰会 W3GS 上发表主题演讲时 他向在场的人们透露 MMO 农场游戏 Pixels 的日活跃用户数已经超过了 130 000 人 这使
  • logback配置xml日志文件(保姆级教程)

    前言 这是个啥 这就是个控制日志输出格式 控制日志输出位置 控制日志输出环境 控制日志输出级别的玩意 控制忽略输出的日志就这些功能 没有什么很复杂的东西 废话不说多了 配置介绍 configuration
  • 题解 | #二维数组中的查找#C++二维数组暴力解法

    试用期被裁概率大嘛 华为西安 三一 在电信工作可以躺平吗 选offer 2022届offer收割机手把手教你拿offer 面试篇 新媒体运营面试的常问题都整理出来啦 还是准备辞职了 感觉我真的不适合上班 攒了点钱 准备辞职了 后面也不打算再
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • Android开发--自定义时频域折线绘制图

    直接上干货 1 XML
  • Kafka速度之谜:高性能的幕后秘密大揭秘

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 kafka高性能的原因 Page Cache ZeroCopy 零拷贝 前言 Kafka的介绍 kafka是linkedIn开源的分布式消息系统 归给Ap
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车
  • 题解 | #翻转单词序列# 复习Java几个集合方法使用

    人生第一次面试gg 字节跳动 复活赛 二面 字节后端实习面试 字节飞书后端一面凉经 字节 客服平台 一面面经 已挂 菜鸟前端 避雷避雷中华财险 中厂大厂到底怎么选 樊登读书精准营销岗面经 跨行 转技术岗进大厂的好机会 来看 岗位名称 云 软
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 两个月进口猛增10倍,买近百台光刻机,难怪ASML不舍中国市场

    据统计数据显示 2023年11月和12月 中国从荷兰进口的光刻机设备同比猛增10倍 进口金额超过19亿美元 让ASML赚得盆满钵满 ASML早前表示中国客户在2023年订购的光刻机全数交付 2023年11月中国进口的光刻机达到42台 进口金
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

    文章目录 零 前言 一 加法 高精度加法步骤 P1601 A B 二 减法 高精度减法步骤
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升