首页 Working on it
文章
取消

Working on it

分 2 部分介绍:

  • 「日常需求」的完整工作流程
  • 「线上服务」的运维

一. 流程

前提:

  • 效率相关(相关指标)
  • 故障相关
    • 定义什么是故障
    • 定义故障等级(受影响用户数 + 时长)
    • 设定目标

工作流程包括以下环节:

  • 技术评审
  • 变更管理:
    • 代码分支管理
    • 代码提交卡点:代码规范检测,安全审核,中间件版本检测,CR,单测通过。。。
    • 数据库(或中间件)变更规范
    • 系统变更管理
  • 推进:开发环境 -> 联调环境 -> 测试环境 -> 预发环境
  • 测试:自测 -> 联调 -> QA 测试 -> QA 验证通过 -> 是否压测?
  • 发布:灰度 -> 引流 -> 分批发布
  • 回滚

1. 技术评审

  • 需求的开发负责人组织评审工作
  • 形式可以多样,但涉及的相关人员都要确认(特别是 QA 人员的确认)
  • 基于「技术评审」的结果确认所有工作的时间表(特别是 QA 人员的测试时间表)

2. 变更管理

  • 代码分支管理:主干开发模式 vs. 迭代分支模式
  • 代码规范 & 安全审核 & 中间件版本检测 & 单测通过
  • CR 卡点时机?
  • 数据库变更规范 & 中间件变更规范
  • 数据库/中间件/系统变更的回滚方案

3. 环境 & 效率

  • 建设稳定的开发/测试环境的目标是效率
    • 自测环境 -> 开发效率
    • 联调环境 -> 联调效率
    • 测试环境 -> QA 测试效率

4. 测试流程

  • 提测时间点
  • 在哪个环境提测的讨论:
    • 「测试环境」vs.「预发环境」(需要同时测试多个需求?)
  • QA 人员发布「测试报告」
    • 是否压测在「技术评审」时确定

5. 发布

  • 「发布」和「运维」相互关联
    • 「红线」
  • 「发布方案」也是「技术评审」的一部分
  • 依据「效率」&「故障」指标来制定对应的「发布流程规范」
    • 设置各个发布阶段的卡点策略(灰度 -> 引流 -> 分批发布)
    • 需要相关「运维」工具的支持
      • 日志/监控/报警
      • 限流/降级
  • 回滚流程(应急手册 + 事先演练)

6. 中间件的迭代

  • 监控和统计
    • 版本分布/接口分布(日志和统计接口)
  • CR 策略
  • 测试策略
    • 回归测试/压力测试(自动化测试用例集合)
  • 发布策略

二. 运维

1. 运维粒度

  • 业务级别 / 服务级别 / 应用级别。。。
  • 系统级别 / 单机级别 / 容器级别。。。

2. 运维指标

各个「运维粒度」对应的运维指标:

  • 业务级别:业务指标
  • 服务级别:QPS/耗时/失败率
  • 应用级别:CPU / 负载 / 内存 / 错误数。。。
  • 系统级别:上下游错误数
  • 单机 / 容器级别:CPU / 负载 / 内存 / 错误数。。。

但最重要的核心指标还是围绕服务级别:QPS/耗时/失败率

3. 链路梳理

  • 强弱依赖/系统瓶颈/系统容量 -> 压测 -> 风险评估
    • 配合具体业务目标进行梳理
  • 压测相关
    • 压测的风险:也是故障的普遍来源之一
    • 压测流量的区分
    • 压测策略的选择(单机/接口级/应用级/单链路级/全链路级别)

4. 报警监控应急

监控 -> 报警 -> 应急手册

依赖各种运维工具:

  • 监控相关
    • 业务指标跟踪
    • 链路跟踪 + Metric(基于中间件日志)
    • 中间件日志/应用日志错误实时分析
    • 系统指标监控(CPU,内存,负载,网络,JVM。。。)
  • 报警相关
    • 依据「故障」指标来对报警进行设置
    • 核心指标:出现故障到相关人员上线处理的时长
  • 应急相关(基于之前的「链路梳理」,「监控」,「报警」)
    • 预案可能需要包括以下方面:
      • 人员 & 沟通
      • 限流
      • 降级
      • 回滚
    • 应急演练(例如进行压测的同时,对各种预案进行演练)

三. 重点

1. 代码规范检测

Java 语言的话,可以使用一些静态代码分析工具,常用的有:

  • 阿里编码规约
  • PMD
  • SonarLint

具体使用方法,一般有 2 种使用方法:

  • 安装对应的 Intellij 插件。开发人员在编码和 CR 时,利用这些 IDE 插件确认代码能通过这些检测
  • 利用对应的命令行工具(可能是 maven 插件的形式)对代码库中的代码自动扫描

2. 技术评审

「日常需求任务」的技术评审主要包括以下要素:

  • 任务背景和任务内容的介绍
  • 涉及到的系统的工作细节(例如:「时序图」)
  • 涉及到的相关「接口」的文档
  • 本次任务的实现方案(选择该方案的考量?计划怎么做?涉及哪些系统的改动?)
  • 列举需要变更的各个系统的改动点(可以精确到代码级别)
    • 各个改动的负责人也要在这个时候明确
  • 埋点+统计方案和大概的验证方法(如果需要)
  • 中间件的改动(如果需要。可能包括:DB,缓存,RPC。。。)
  • 性能影响和压测方案(如果需要)
  • 发布方案(如果需要)
  • 风险评估及其应对方案(如果需要)
  • 开发时间预估
    • 特别是给出最终关键时间节点的「时间」
      • 例如:「什么时候能确定提测时间

3. 基础设施变更的回滚

也就是类似「数据库变更」,「中间件版本变更」,「系统软件变更」等基础设施变更的回滚方法。

先讲一下「数据库变更」的回滚:

  • 所谓「数据库变更」最常见的场景其实就 3 种:新增表,加字段,改字段类型。这 3 种变更的回滚其实还好
    • 「加索引」要谨慎(变更和回滚方案要和 DBA 确认)
    • 其他不常见的场景,就需要事先和 DBA 制定详细的计划了(例如在「技术评审」阶段)

再讲一下「其他基础设施变更」的回滚,例如「中间件版本」,「系统软件」等设施的变更:

  • 在做回滚之前,先要确认「交付物」是什么:
    • 如果是当前流行的:镜像(Docker 镜像这种),Mesh,Serverless,比较简单,使用对应的成熟方案即可
    • 如果还是传统的「二进制包」,就需要发布人员有一套稳定的「脚本工具」来实施对应的发布/回滚等工作
  • 另外,回滚方案可能需要演练

4. 中间件版本/接口管理

方法如下:

  • 中间件日志的目录(例如:/home/admin/logs)和应用服务的目录分开
  • 一般中间件目录下会重点记录以下日志(这些日志会记录到不同的日志文件):
    • trace 信息
    • 实施监控统计信息(看具体情况,可以到分钟级,30 秒级等。。。)
    • 错误信息
  • 然后可以通过这些日志掌握当前中间件运行的状况,基于这些状况可以实现监控,报警
  • 甚至可以暴露 HTTP 接口来查询到中间件的运行状况

有了以上这些单机的信息之后,就可以汇总得到中间件「可视化大盘」

5. 监控指标

这里重点介绍一下需要重点关注(监控+记录)的单机指标(有了单机指标后,汇总起来就能得到整体指标,并可以组合出各种报警):

  • 系统(物理机和容器)级别的指标:
    • CPU 相关(用户级,系统级,等待,切换,steal。。。)
    • 内存 相关
    • 磁盘 相关
    • Load(负载)
    • IO 相关:「网络流量」,「网络错误」,「磁盘 IO」,「磁盘错误」等
  • JVM 指标:
    • GC 相关
    • 堆相关
    • 线程数
  • 接口级别的指标(本身接口和依赖的上下游接口):
    • 实时流量(秒级,分钟级。。。)
    • 实时失败数
    • 实时失败率(「成功率」)
    • 实时 RT(也就是延时):平均,最大,百分比
  • 应用级别的指标:
    • 实时日志中的 error 数
    • 实时业务指标
    • 实时资损(如果有的话)
  • 中间件级别的指标:
    • 包括 DB,缓存,RPC,消息队列。。。
    • 限流相关监控
  • 测试用例定时执行(预发环境 + 线上环境)
本文由作者按照 CC BY 4.0 进行授权