线上事故风险解读之技术漏洞

专业在线打字练习平台-巧手打字通,只输出有价值的知识。

一 前言

基于《线上事故案例集》一文,我们继续深入剖析线上事故的原因,旨在为读者提供有价值的见解与思考。

通过对这些事故的细致分析,我们发现技术漏洞、运营环境配置不当、系统设计缺陷等因素是导致线上事故频发的关键所在。

  • 技术编码漏洞:
    包括数据库使用不当、违反编码规范等问题,这些问题往往源于对技术细节的忽视,以及对编码规范的漠视。
  • 运营环境配置错误:
    如机器扩容时忘记绑定host,导致扩容未生效,或线上传参调用错误环境等,这些配置错误常常由于流程不规范或人工干预过多而引发。
  • 系统设计缺陷:
    如多个业务共用MQ主题导致消息积压,或数据库读写分离设计不当导致读从库数据无结果等,这些设计缺陷在系统设计初期未能充分考虑业务场景和性能需求。
  • 安全意识薄弱:
    包括日志不规范输出、敏感信息泄露等问题,这些问题反映出安全意识在开发过程中的重要性。
  • 中间件使用不当:
    如ExecutorCompletionService线程池使用不当导致OOM,这类问题源于对中间件使用的不熟悉或误解。
  • 测试覆盖不全:
    包括测试用例场景覆盖不全、预发布和线上配置不一致等问题,这些问题导致线上事故在测试阶段未能被及时发现。
  • 数据一致性设计不足:
    如数据在两个系统之间同步时未触发同步逻辑,导致业务数据状态不一致,这类问题反映出数据一致性设计在系统设计中的重要性。
  • 环境隔离不足:
    如预发布环境引用了生产环境服务,导致向用户推送无效文案,这类问题源于环境隔离措施不足。

本文将聚焦于技术漏洞这一核心议题进行深入探讨。技术漏洞的根源多种多样,可能源自架构设计的不合理,技术选型的不恰当,或是编码实现的过于草率。然而,在这些显而易见的表象之下,隐藏着一个更为深层次的问题——工程思维。

二 边界思维的重要性

  • 在业务运营中,为各项业务活动设定明确的边界阈值,是至关重要的。即使业务团队或产品部门并未明确提出此类需求,技术层面也应当基于过载保护、控制边际成本等关键因素,主动设定合理的边界。这种做法旨在预防系统因过度承载而崩溃,确保业务能够稳健运行。

  • 以实际场景为例,我们可以为个人用户设定领取优惠券的最大数量限制,防止因恶意刷券或系统漏洞导致的资源滥用。同样,在商品库存管理上,设定库存的最小值限制,可以确保商品供应的稳定性,避免因库存告急而引发的用户体验下降。

综上所述,边界思维不仅体现了技术层面的前瞻性,更是对业务稳健运营的有力保障。通过设定合理的边界阈值,我们可以在源头上规避潜在风险,确保业务在可控范围内高效运行。

三 底线思维的实践

在保障生产系统的稳定运行方面,底线思维扮演着至关重要的角色。它要求我们在核心业务流程中,必须配置合理的异常处理机制,如重试逻辑、快速失败策略、限流措施以及降级方案等。这些保护机制的存在,旨在有效防止单点故障扩散,避免整个服务系统因局部问题而陷入全面崩溃的境地。

四 墨菲定理的警示

在软件开发领域,墨菲定理提醒我们绝不能心存侥幸。程序是严格按照既定逻辑执行的,因此,任何可能存在缺陷或出错的地方,都有很大的概率会在某个时刻暴露出问题。

举例来说,当代码发生变动时,我们必须审慎地思考是否需要进行代码审查(code review),以及是否已经完成了全面的回归测试,来确保改动的正确性和系统的稳定性。

五 奥卡姆剃刀原理

在技术选型的过程中,我们应当时刻铭记“如无必要,勿增实体”的精简原则。这意味着我们需要综合考虑业务场景、团队的知识储备以及技术方案的长期效益,以避免不必要的沉默成本。

这些成本可能包括高昂的准入门槛、复杂的漏洞修复流程以及繁琐的运营维护工作。
以下三个案例深刻揭示了忽视这一原则可能带来的后果。

案例一:MongoDB的困境

商品系统中,某团队选择了MongoDB作为存储方案。然而,随着商品业务的不断扩展和数据量的急剧增加,MongoDB的局限性逐渐暴露出来。扩容变得困难重重,运维和技术优化也显得力不从心。核心系统对接了上下游上百个调用方,团队付出了巨大努力,仍难以快速完成技术转型,导致系统性能瓶颈突破困难。

案例二:FastJson的安全隐患

FastJson类库频繁爆出安全漏洞问题,这使得所有依赖该中间件的应用不得不频繁进行维护升级。这不仅增加了开发团队的工作量,还可能对系统的稳定性和安全性造成潜在威胁。在未来的技术选型中,团队必须权衡这一因素,避免再次陷入类似的困境。

案例三:Jar包版本冲突的困扰

有时,程序在没有进行任何重大调整的情况下却突然无法启动。预发布环境一切正常,但部署到线上环境后却出现了问题。这种情况往往是由引入的Jar包版本冲突导致的。为了避免这类问题,我们需要严格控制项目依赖,确保每个Jar包的版本都是经过充分测试和验证的。同时,我们也要遵循“如无必要,勿增实体”的原则,避免引入不必要的依赖和组件。

综上所述,“如无必要,勿增实体”的精简原则对于技术选型至关重要。它提醒我们在选择技术方案时要综合考虑各种因素,以确保系统的稳定性、安全性和可维护性。

六 技术债务的管理

  • 在软件开发过程中,面对环境限制、紧迫的工期以及临时功能需求等客观挑战,我们时常会采取一些低成本、快速的解决方案,如硬编码、功能删减或复制其他应用的代码等,以迅速实现需求交付。然而,从软件生命周期的长远视角来看,这些做法实际上是在积累技术债务。随着债务的不断累积,软件的运营成本将大幅上升,可靠性也将受到严重威胁。

  • “让营地比来时更干净”这一军事原则,在软件开发领域同样具有深刻的启示意义。它强调每次代码提交都应比拉取时更加整洁,每个方法在被修改后都应比原先更加优化,哪怕只是进行了一次微小的改进,如重命名变量或消除少量重复代码。这种持续优化的态度是保持工程整洁、延缓系统腐化的关键。

  • 为了有效管理技术债务,建立一个系统的技术债务表是一个明智之举。债务表的存在能够让我们时刻保持危机意识,将系统优化纳入日程。随着债务条目被逐一解决,我们对系统的掌控力将不断增强,软件的整体质量和性能也将得到显著提升。

因此,在软件开发过程中,我们应时刻警惕技术债务的积累,坚持持续优化和改进,以确保软件的长期稳定性和可靠性。

七 技术漏洞重灾区

  • 跨系统数据一致性设计的脆弱性

在多个系统间进行数据交互时,数据一致性的设计往往成为漏洞的高发地带。若缺乏有效的同步和校验机制,易导致数据在不同系统间出现偏差,进而引发业务异常。

  • 异常处理流程的合理性考验

异常处理流程是否设计得当,直接关系到系统在面对异常情况时的稳定性和恢复能力。若处理不当,不仅可能掩盖潜在问题,还可能加剧系统的不稳定性。

  • 方法入参和出参处理的细微差别

方法入参和出参的处理细节,往往决定了系统间交互的准确性和可靠性。若处理不当,可能导致数据传递错误,进而影响业务逻辑的正确执行。

  • 测试场景覆盖的全面性挑战

测试场景的全面性直接关系到系统上线后的稳定性和安全性。若测试覆盖不全,易遗漏潜在问题,导致系统在实际运行中出现漏洞。

八 总结

“有道无术,术尚可求;有术无道,则止于术。”这句话深刻地揭示了工程思维的重要性。它不仅仅是一种技能或方法,更是一种需要不断学习、实践、积累和沉淀的思维模式,最终升华为指导我们行动的方法论。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Lesson3 - 操作系统软件视角和系统调用

文章目录 硬件支持系统 系统管理硬件异步行为中断的分类 同步行为虚拟地址空间shell系统调用与软中断区分系统调用trace 命令 硬件支持系统 系统管理硬件 计算机硬件由三样东西组成:CPU、内存、I/O设备。为了更有效地管理这些硬件资源,系统设计者引入了…

使用bert模型进行命名实体识别任务

一、实验内容 本实验使用预训练的 BERT 模型进行命名实体识别(NER)任务,并且使用 Hugging Face 的 Transformers 库完成模型的训练、验证和测试。最后,使用测试集评估模型性能,计算NER指标。 二、算法介绍 Bert是一种…

Observability:使用 OpenTelemetry 自动检测 Go 应用程序

作者:来自 Elastic Damien Mathieu 使用 OpenTelemetry 检测 Go 应用程序可以深入了解应用程序的性能、依赖项和错误。我们将向你展示如何使用 Docker 自动检测 Go 应用程序,而无需更改应用程序代码。 在快节奏的软件开发领域,尤其是在云原生…

分治算法(3)_快速选择_数组中的第K个最大元素

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(3)_快速排序_数组中的第K个最大元素 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&#…

【原创】Anaconda+VScode+PySide6 完美配置Python开发环境,亲测!

准备工作 下载安装 Anaconda 下载安装Visual Studio Code 配置系统环境变量 配置Anaconda环境变量 将Anaconda安装目录及Scripts 、Library\bin 两个子目录添加到用户变量或系统变量的Path变量中。 Anaconda自带最新版Python,如果已经安装Python,建议…

Mybatis测试案例

1.创建springboot工程 创建实体类user和接口 user类 注意:java和mysql的对象的属性数据类型要一致 mapper接口 2.配置mybatis(连接数据库信息) # spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #地址url spring.datasource.urljdbc:mysql://localho…

【Python】Mistune:高效的 Python Markdown 解析器

Mistune 是一个轻量且强大的 Python Markdown 解析器。它的设计目标是兼顾速度和扩展性,同时兼容 CommonMark 标准。Mistune 支持多种渲染器(Renderers)和插件,能够根据需求将 Markdown 转换为 HTML、LaTeX 或自定义格式。此外&am…

Java中数组的应用

Java中数组的应用 数组数组的使用使用方式1-动态初始化数组的定义:数组的引用(使用/访问/获取数组元素):快速入门案例 使用方式2-动态初始化**先声明**数组**再创建**数组使用方式1和2的比较 使用方式3-静态初始化初始化数组快速入…

[嵌入式Linux]—STM32MP1启动流程

STM32MP1启动流程 1.启动模式 STM32MP1等SOC支持从多种设备中启动,如EMMC、SD、NAND、NOR、USB、UART等。其中USB、UART是作为烧录进行启动的。 STM32MP1内部ROM中存储有一段出厂代码来进行判断从哪种设备中启动,上电后这段代码会被执行,这…

CPU中的寄存器是什么以及它的工作原理是什么?

在计算机科学中,寄存器是数字设备中的一个重要组成部分,它用于存储数据和指令以快速处理。寄存器充当临时存储区,信息可以在这里被快速访问和操作,以执行复杂任务。寄存器是计算机中最基础的存储类型,它们在帮助机器高…

【Unity】版本不一致且未升级资产,导致 Unity Sprite 2D 动画播放错误

自己的 Unity版本是 2022.3.45f1。目前折腾的这插件 2D Action RPG Engine: Mythril2D ,推荐使用的 Unity 版本是 2021.3.18。 倒腾了这个 unity animation 动画半天,发现这个 animation sprite resolver 在导入动画帧的时候,一直都导入的是…

allegro 替换过孔

操作步骤如下 1.选择操作对象(需要替换的过孔),右键–>Repace……–>Selected…… 2.在弹出的窗口中选择最终需要的过孔既可以

【Matlab学习日记】② 常用滤波以及噪声分析方法(上)

关注星标公众号,不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 【Matlab学习日记】专栏目录 第一章 ① Sinmulink自动代码生成教程 第二章 ② 常用滤波以及噪声分析方法(上) 文章目录 前言一、使用滤波的目的二、常见的几种噪声和表…

算法闭关修炼百题计划(四)

仅供个人复习 1.两数相加2.寻找峰值3.寻找旋转排序数组中的最小值4.寻找旋转排序数组中的最小值II5.搜索旋转排序数组6.岛屿的最大面积7.最大数8.会议室9.最长连续序列 1.两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储…

STM32 通用同步/异步通信

一、串行通信简介 CPU与外围设备之间的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。STM32单片机提供了功能强大的串行通信模块,即通用同步/异步收发器(USART)。 1.串行通信 串行通信是数据字节一位一位地依次传送的通信方式。…

毕业设计 深度学习水果识别

文章目录 1 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果 1 前言 Hi,大家好,这里是丹成学长,今天做一个 基于深度学习的水果…

毕业设计——医院信息化系统原型设计

作品详情 主要功能: 信息化系统是以患者为中心,服务于重症科室医务人员,提高工作效率及医疗服务质量。软件主要包含了重症医学临床管理系统和中央监控站,重症医学临床管理系统主要实现患者床位总览、患者护理、医嘱管理、数据字典…

JS 介绍/书写位置/输入输出语法

目录 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS 的组成 2. JS 书写位置 2.1 内部 JS 2.2 外部 JS 2.3 内联 JS 3. JS 注释和结束符 4. JS 输入输出语法 4.1 输入语法 4.2 输入语句 4.3 执行顺序 5. 字面量 1. JS 介绍 1.1 JS 是什么 1.2 JS 的作用 1.3 JS …

GOM引擎启动后M2提示Invalid filename报错的解决办法

在架设一个GOM引擎版本的时候,启动M2就提示Invalid filename,之后的网关就没有办法再启动了,研究了半天也终于是弄好了,其实也简单,就是路径设置的不对,所以无法完成启动,很多人以为在控制台设置…

国庆节刷题

10.1 C语言 10.1 C 10.2 C语言 10.2 C 10.3 C语言 10.3 C 10.4 C语言 10.4 C 10.5 C语言 10.5 C 10.6 C语言 10.6 C