数据研发“新人”如何快速落地?

作者:肖迪(墨诩)

图片

一、前言

这个季度主推安全月构筑&夯实稳定性底盘,就组织了组里的同学对核心业务链路进行了稳定性的摸排。在摸排过程中,不断有个声音在问你摸排出来的问题就是全部问题么?你加的监控加全了么?你的技改方案考虑全了么?(这个声音主要来自左耳,因为我leader坐在我的左边,哈哈哈哈)所以我们一直在思考和对焦,如何体系化的进行稳定性建设,横向有方法论的指导与沉淀,纵向可以跟踪各个业务线的过程和结果,于是就有了下面这张图。

图片

这张图主要分为四个部分,一、确定目标,是一切开始的前提;二、方法论部分用于沉淀稳定性建设的理论方法,支撑后续的动作;三、动作路由,对应方法论部分希望可以用一张图把建设路径讲清楚;四、拿结果,对应各个阶段进行进度跟踪,保证可以拿到最后的结果。方法论部分会主要以如何摸排为主回答前面的三个问题。

二、确定目标

做稳定性摸排的第一原则是要假设任何地方都可能出问题,但只有原则的直接影响就是,摸排过程中会觉得“都是问题,又可能都不是问题”。所以,做摸排的第一件事就是要确定目标,有了目标才有重点和优先级。

整体的目标,应该所有业务都大体相同,“无Px以上故障”,“0资损”,“故障恢复1-5-10”。但针对不同的业务和不用应用的职责会有不同的目标偏重,比如2C业务的目标更偏重服务稳定性,2B业务的目标更偏重数据一致性,涉及到资金流转的业务目标更偏重资损

所以在摸排之前一定要确定自己负责的业务应用的目标是什么,可以和GOC的同学拉通所有的故障场景,这样摸排的优先级会更清晰。有了重点目标之后,就可以分清楚哪些是核心链路,并且在摸排的过程中也可以将摸排出的问题标出优先级,有助于我们后续更快更有效的加监控和技改。

以我们自身的业务来举例,我们团队叫内容资产,是负责优酷百亿级别内容引入资产的管理和价值挖掘。三块主业务是内容版权管理的CRP,内容权利管理的CCC,以及内容引入的开放平台。CRP管理版权信息流和资金流,所以重点目标是0资损;CCC的数据会影响下游端侧是否有播放权利,内容播放不了可能会引发客诉,所以重点目标是避免数据不准确导致的客诉;开放平台的用户是合作商算是半2C,所以重点目标是服务可用。

CRP的第一重点是0资损,所以可能引发资损场景的就是核心链路;可能引发资损的问题优先级为高;2B业务的重点在于数据的准确性,所以可能导致数据不准确的问题优先级为重;其他的比如易用性问题、不影响前俩项的服务不可用问题等等可以列为低。

三、方法论

3.1 你摸排出来的问题就是全部问题么?

这是稳定摸排面临的第一个问题,面临这个问题的时候我们必须得承认,没有任何银弹可以干掉一切妖魔鬼怪,顺带带走“黑天鹅”。但如何把我们认知范围内的隐患全部找到,应该是可以有一套方法论的。

在团队最开始做摸排的时候,为了解决这个问题我根据经验拉了一个很长的list,希望在排查代码的时候可以辅助找到所有的问题。这种方法有俩个问题:第一个“如果没有优先级那么所有问题都是低优先级”,假设每一行代码都有可能出现问题就会不知道从哪开始,而且工作量巨大;第二个“只有结果没有过程”,在实际过问题列表的时候,没有办法判断是否是全部问题。

可见上述的方法不是一个可靠高效的方法,我们需要一种可以指导过程并推导出完整结果的方法论。

流程摸排路由

整个流程摸排路由中,我们需要三张图:核心链路图、流程时序图、问题路由图

图片



核心链路图

摸排的原则是假设每一行代码都可能出问题,但我们不可能一次性全部摸排完成,那应该高优的摸排的代码是哪些?这个就是需要从我们最开始确定的目标开始推导,可能会发生重点问题的流程就是高优排查的范围。以CRP举例,CRP的第一重点是0资损,那涉及到资损的付款流程就是我们要高优排查的模块,其中实际的审批付款流程是需要高优排查的,付款列表等不会产生资损可以优先级放低。

根据推导我们找到了核心链路,转化成业务的核心链路图,图中要重点产出:1、N条核心链路;2、各链路的调用入口;3、链路过程中的中间件以及查询依赖;4、写入依赖。

图片

流程时序图

有了核心链路图之后,我们就确定了优先摸排的范围,然后就要实际梳理代码,产出核心链路对应的流程时序图。时序图要保证俩件事情:1、N个核心链路至少要对应N个流程时序图,保证不会漏掉;2、在流程时序图中,对于RPC调用和关键实体的操作要重点关注,不要漏掉。

图片

问题路由图

经过前俩步的推导,找到了核心链路中的关键节点,接下来只需要根据关键点的类型,路由到可能出现的问题进行重点排查。调用入口出要注意流量问题、核参校验问题、幂等问题;写入依赖需要注意不可用问题、幂等问题、数据一致性问题等;流程过程中要注意事务问题、并发逻辑问题以及会带来资损的金额计算问题等。



图片



有了这三张图,我们就可以将每一行代码都进行全量问题的摸排判断,缩减为核心流程中关键节点对应的各自类型的问题摸排判断;并且过程中有了核心链路和关键节点的推导,可以保证不会带来摸排遗漏。在组内review的时候,上面三个图也可以提供是否“全”的判断依据。

3.2 你加的监控加全了么?

解决了摸排问题不全的问题,面临的第二个问题就是我们加全了么?监控作为发现问题的主要手段,在日常运维工作中非常重要,如果可以尽早发现就可以及时止血。常用的监控手段有数据对账和日志监控俩种,数据对账常用于信息流与资金流流转的数据一致性监控,日志监控常用于系统流程异常的监控。那我们又如何保证我们的监控是全面和有效的?

数据依赖路由

数据对账是为了发现信息和资金流转过程中的数据不一致问题,但业务单据的字段少则几十多则上百,到底应该加哪些字段的监控,对账的触发点应该怎么设置?还是三张图推导:场景用例图、数据模型依赖图、状态机列表。

图片

场景用例图

首先还是要从目标出发进行推导,找到所有重点问题可能发生的场景,将场景用例画到脑图中。重点是要涵盖所有的问题场景,以及问题场景中所涉及的业务实体与字段。

以我们自身的业务场景为例,版权资产的付款是优酷内容引入的资金链出口,容易产生资损场景。资损场景主要实际支付金额不对、付款金额计算不对、重复付款三个场景。

付款金额计算不对:

1、CRP付款单提交的时候,要保证付款的金额不能超过合同保底金额

2、......

实际支付金额不对:.......

图片

通过上面的梳理就可以得到第二张图

数据模型依赖图

还是沿用上面的例子,根据上图所有场景的描述中可以推导出所有涉及的业务实体的依赖关系以及关键字段,这些就是我们需要做数据对账的核心字段。核心字段有了就要解决第二个问题,触发对账的event应该是什么?多数情况下我们只会去按照业务流程走向正向的添加监控,比如以提交CRP付款单为event,触发单据金额与合同金额的对账。

这样会覆盖到大部分的问题场景,但同时可能会忽略一些低频却又很重要的问题。比如CRP付款单已经提交触发正向的数据对账通过,但在资金流流转过程中,合同的金额变小且小于付款的金额,如果做不到及时通知并且干预,就会产生资损问题。

图片

所以在添加监控的时候,除了根据业务走向的正向数据对账之外,也要考虑逆向的数据对账,并根据可能产生问题的严重程度进行有优先级的监控建设。

状态机列表

由于付款单据与付款凭证(账单)之间的状态流转有依赖关系,俩个单据自身的状态流转也有卡口规则,所以在实操过程中我们列了一个状态机列表,辅助数据对账准确无遗漏的落地。这个图非必选,但如果摸排的业务中同样有复杂的业务单据状态流转的依赖关系,建议画出此图辅助监控的添加。

图片

系统级统一监控

除了数据对账监控,另一个重要手段就是日志监控。加日志监控的时候通常会面临一个状况,就是加了监控也很难定位到问题。所以我们需要一个方法不仅可以发现问题发生,还能定位到具体是哪里出现问题,具体什么问题,甚至在多机器应用到底是哪台除了问题。这里我们借鉴了一位大佬的方法论,配置了一套从整体到细节,从感知到诊断的系统统一监控,可以很好的解决上面提到的问题。↓↓↓↓↓

图片

3.3 你的技改方案考虑全了么?

代码中的问题都定位到了,有些需要进行技术改造,对应不同的问题你的技术方案都考虑全了么?顺着这个问题,我整理了一张图稳定性摸排全链路(摸排->监控补充->技术改造->预案)的Action路由图,希望可以使团队同学在稳定性建设过程中有个体系化的指导。

图片

通用方案主要分为几类,数据一致性方案、幂等方案、防资损方案、慢sql改造方案,慢SQL改造都是基本功,不再赘述。

四、拿结果

这个部分不用多说,就是对应Action路由的各个阶段的过程结果监控,以及最终结果的达成。什么展现形式不重要,重点是要有跟进保证最终结果的达成。截止目前,我们团队在核心链路上共摸排出13个高优的问题,技改方案全部产出review排期解决中;和测试的同学配合新增监控42个,其中19个是摸排出来的;无P级bug,0资损。

图片

五、最后

系统稳定性是保证我们拿到一切业务价值的基础,重要性不言而喻。稳定性建设其实是一个持续性的工作,最近一个财年交接了很多新的业务过来,所以集中做了一次突击摸排。工作多且杂,需要测试、产品、开发团队通力配合完成,过程中一起总结出来的一些方法论希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程同步与互斥

目录 进程同步与互斥(1) 第一节、进程间相互作用 一、相关进程和无关进程 二、与时间有关的错误 第二节、进程同步与互斥 一、进程的同步 二、进程的互斥 三、临界区 进程同步与互斥(2) 三、信号量与P、V操作的物理含义…

Tomcat 下部署 jFinal

1、检查web.xml 配置&#xff0c;在 tomcat 下部署需要检查 web.xml 是否存在&#xff0c;并且要确保配置正确&#xff0c;配置格式如下。 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

使用命令行(CMD)编译单Java文件

1.安装JDK JDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/ 选 Windows -> x64 MSI Instaler或者x64 Installer 安装成功后。 2.配置环境变量 按下Win键&#xff0c;搜索环境变量 添加JAVA_HOME系统环境变量&#xff0c;要指定类似这样的路径(…

Dubbo学习(一)——dubbo学习背景

文章目录 前言分布式基础理论什么是分布式系统发展演变ORMMVCRPCSOA RPC(远程调用)什么是RPCRPC工作原理 为什么RPC要用到DubboDubbo的优势高性能可扩展性高可靠性监控和管理 使用示例总结 前言 分布式基础理论 什么是分布式系统 分布式系统是若干独立计算机的集合&#xff…

月木学途开发 1.后台用户模块

概述 权限控制采用springsecurity 数据库设计 用户表 DROP TABLE IF EXISTS admin; CREATE TABLE admin (aid int(32) NOT NULL AUTO_INCREMENT,email varchar(50) DEFAULT NULL,username varchar(50) DEFAULT NULL,password varchar(255) DEFAULT NULL,phoneNum varchar(2…

在Ubuntu 18.04上支持C++17的std::filesystem的方法

在Ubuntu 18.04上通过命令sudo apt install gcc g安装的gcc/g版本为7.5&#xff0c;此版本并不直接支持filesystem&#xff0c;如下图所示&#xff1a; Ubuntu 18.04上的g 7.5支持experimental的filesystem,即std::experimental::filesystem&#xff0c;若想使Ubuntu 18.04支持…

软件设计原则扩展

一、引言 经典的软件设计7大原则 开闭原则&#xff08;Open Close Principle, OCP&#xff09; 依赖倒置原则&#xff08;Dependence Inversion Principle, DIP&#xff09; 单一职责原则&#xff08;Simple Responsibility Principle, SRP&#xff09; 接口隔离原则&#xf…

OPENCV实现DNN图像分类

使用步骤1 使用步骤2 使用步骤3 使用步骤4 使用步骤5 使用步骤6 完整代码如下: import numpy as np

Git --- 基础介绍

Git --- 基础介绍 git 是什么git --- 工作区, 暂存区, 资源库git --- 文件状态git --- branch 和 HEADgit --- 一次正常的git提交流程 git 是什么 Git是一款分布式源代码管理工具(版本控制工具)Git和其他传统版本控制系统比较: 传统的版本控制系统(例如 SVN)是基于差异的版本控…

从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)

Stream流 Stream流1.体验Stream流2.Stream流的常见生成方式3.Stream流中间操作方法4.Stream流终结操作方法5.Stream流的收集操作6.Stream流综合练习 Stream流 1.体验Stream流 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中…

ElasticSearch(ES)简单介绍

ES简介 Elasticsearch&#xff08;通常简称为ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;旨在处理各种类型的数据&#xff0c;包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的&#xff0c;但随着时间的推移&#xff0c;它已经演变成一个功能…

后端返回的id到前端后 后面几位数全部变成0了 问题解决

这里 我在java控制台上 输出了id的值 但请求到前端后 很明显就不太一样了 这个问题比较经典的叫法是 雪花算法生成的ID过长&#xff0c;前端接收精度丢失 原因 前端使用number类型进行接收&#xff0c;number类型的范围小于后台Long类型的范围&#xff0c;出现了精度丢失问题…

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

界面控件DevExpress WinForms HTML-CSS模板:预设计UI模板加速.NET应用开发

在过去的一年里&#xff0c;DevExpress官方引入了两个强大的功能来加速/简化.NET桌面应用的开发&#xff0c;当一起使用时&#xff0c;您可以创建优雅/个性化的用户界面&#xff0c;减少重复的代码&#xff0c;从而节省更多的项目时间。 DevExpress WinForms有180组件和UI库&am…

2023_Spark_实验十二:Spark高级算子使用

掌握Spark高级算子在代码中的使用 相同点分析 三个函数的共同点&#xff0c;都是Transformation算子。惰性的算子。 不同点分析 map函数是一条数据一条数据的处理&#xff0c;也就是&#xff0c;map的输入参数中要包含一条数据以及其他你需要传的参数。 mapPartitions函数是一个…

公开研讨会|智能制造中生产管理挑战与解决方案(9月29日)

随着新能源行业的规模化发展&#xff0c;企业增效降本成为迫切需求。生产制造能力成为关键因素&#xff0c;其发展必将是在大规模生产的前提下&#xff0c;追寻极简制造、极限制造以及智能制造。然而在这个发展过程中&#xff0c;企业依旧面临着诸多挑战&#xff1a; 产品设计…

DAZ To UMA⭐一.DAZ使用简介 / 设置DAZ导出的内容 / 获取模型纹理贴图

文章目录 🟥 DAZ快捷键🟧 DAZ界面介绍🟩 设置DAZ导出的内容1️⃣ 找到要导出的参数名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Assets🟦 获取模型纹理贴图🟥 DAZ快捷键 移动物体:ctrl+alt+鼠标左键 旋转物体:ctrl+alt+鼠标右键 导入模型:双击左侧模型…

大数据-玩转数据-Flink SQL编程

一、概念 1.1 Apache Flink 两种关系型 API Apache Flink 有两种关系型 API 来做流批统一处理&#xff1a;Table API 和 SQL。 Table API 是用于 Scala 和 Java 语言的查询API&#xff0c;它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。 Flink SQL 是…

23种设计模式汇总详解

设计原则 中文名称英文名称含义解释单一职责原则Single Responsibility Principle(SRP)任何一个软件模块都应该只对某一类行为者负责一个类只干一件事&#xff0c;实现类要单一开闭原则Open-Close Principle(OCP)软件实体&#xff08;类、模块、函数等&#xff09;应该是可以扩…

七绝 . 秋寒

题记 拜读署名“淡定人生D”近日发表在“ 今日头条 ”上的古体诗《七绝 . 凉》&#xff0c;本老朽在由衷赞叹该女子才貌双全之时&#xff0c;也对自己寄居养老的成都崇州街子古镇今日下午的秋寒突至天气&#xff0c;情怀涌动&#xff0c;思绪万千&#xff0c;亦作《七绝 . 秋寒…