系统稳定性设计原则:简单、冗余、标准化、健壮

2023-11-18

作者介绍

淇公,蚂蚁金服技术专家。热爱java和一些函数式语言,长期关注系统稳定性领域

640?wx_fmt=png

因为base在分公司,需要经常去总部出差,所以搭乘飞机成了家常便饭,很多时候坐在飞机上会不由的感叹,设计制造这样精密复杂的机器的那帮人真的是了不起,他们是怎样保证这样一台由无数零件组成的设备能够稳定运转的?

于是去简单查阅了一些资料,了解到无论任何情况下,我们所乘坐的客机从生产到投入运营,任何细节都是将可靠性放在第一位的,简单来说,体现在:

设计阶段:

方案尽量简化,冗余设计,采用成熟经过验证的技术,标准化,健壮性设计等等.

测试阶段:

气动力试验,环境试验, 可靠性与寿命试验,真实试飞,各项极限测试等等

运行阶段:

机组:

一架飞机在云端飞行,无数次面对气流的颠簸,起飞降落的冲击仍然能够保证安全可靠,这背后从设计到制造再到维护,完全是一项系统工程, 需要极高的专业水平和责任心才能胜任, 而工程领域的实践经验通常都有相通性,作为一名软件开发人员,不禁要思考我们所开发,运营,维护的软件系统,同样是一项专业的系统工程, 同样需要满足极高的稳定性要求,面对汹涌而来的流量冲击,软硬件变化的影响仍然需要屹立不倒,我们需要怎么做? 对比苛刻的航空器可靠性要求以及保障策略和手段,我们可以从中学到什么?

首先要明确稳定性保障时什么,在我看来,系统稳定性保障的内容包括:

稳定性保障通常来讲是指保障系统在运行, 运维过程中, 即时面对各种极端情况或突发事件仍然能够提供持续的, 可靠的服务能力.

此处所指各种极端情况或突发事件包括且并不局限于机房级故障, 城市级故障,线上故障, 线上业务量瞬时爆发, 持续快速增长, 系统服务器故障, 依赖数据库故障, 环境数据改变, 依赖系统故障等.

此处所指持续的, 可靠的服务能力是指受影响集群依据突发情况严重程度,在业务可接受的时间范围内完成恢复或失败转移,继续提供正确的服务能力以及足够的运算能力.

看上去挺吓人的,总结起来就是系统一旦上线运行,那么无论面对什么情况都尽量不要出问题,如果出了问题也要求可以快速解决和恢复.

何其复杂的要求,良好的设计, 严格的,全面的测试验证,持续的运营维护,迭代,重构,升级,经验丰富的研发维护团队缺一不可,航空业以安全为最高准则,我们则以系统稳定作为底线.

民用飞行器的设计原则包括方案简单,冗余设计,技术成熟,标准化,健壮.而软件系统的稳定性同样与设计方案息息相关:

职责清晰,单一的系统,其稳定性保障的难度会小于大杂烩,功能繁多的系统,不同的业务功能,其业务特征,业务形态,业务量,资源使用形式,依赖关系都可能不同,如果混合在一个系统中,将很难避免相互影响.

设计师在设计飞机时,会在可以达到目标的情况下,尽量选择简单的方案,这样无论从成本节省还是维护效率上都有所提升,两点之间直线最短,对于系统设计也是一样的,一定不要过度设计和为了技术而技术,比如一组配置数据,数据量不大,实时性要求也不高,就不要去引入分布式缓存,变更通知,简简单单的JVM堆内缓存+定时刷新就可以搞定,维护简单方便,否则技术栈的加深,维护节点的增加都会带来更多的不稳定因素。

冗余设计,对于飞机而言,体现在机组包括机长副机长,引擎至少双发,操作系统至少两套等等,于我们的系统而言,则通常体现在:

  • 数据冗余,数据多份副本,DB一主多备,出现问题时可以快速切换.

  • 计算能力冗余,服务器的计算能力始终保持一定冗余,在一组服务器出现问题时其他服务器可以接替提供服务,亦或在业务量波动时可以承受冲击。

  • 网络,存储或其他基础设施冗余,出现意外时,比如断电,光纤断裂时均有备用可以实现切换,快速恢复。

技术成熟,标准化,通常来说,在企业级的应用中,技术选型是非常重要的,由于对可靠性有极高的要求,因此一种技术组件或框架,中间件在引入时要充分的考虑:

  • 是否经过充分的验证

  • 是否有广泛的用户基础,有足够有经验的开发人员

  • 是否有完善的文档和技术支持

标准化则比较典型的运用于系统交互协议标准化,数据模型标准化,服务标准化,标准化带来的好处也非常显著:

  • 规范系统之间的交互方式,便于维护,管理

  • 提升效率,避免重复造轮子

  • 降低技术学习曲线,解放人员劳动力

  • 信息理解无偏差,数据流动顺畅

  • 服务约定明确,能力清晰,对接效率高

健壮性对于飞机的安全至关重要,因此飞机所使用的设备,材料都经过各种严格的健壮性测试,确保可靠性,对于软件系统而言,本身是个比较大的命题,一般来讲是指系统的容错能力,无论是一次错误的输出,或是一个依赖服务的崩溃都不应该影响系统自身的服务能力和正确性,这一点本身不容易做到,但也有一些手段可以辅助我们尽可能做好:

良好的编码规范和严格的测试验证,比如对异常的捕获处理,对边界数值的验证避免单点依赖,无论是系统单点还是技术单点,这包括关键依赖服务应该集群化,多单元甚至多地部署,设计灾备方案,比如DB 的FO,交互的同步转异步,RPC转消息等等,保证在依赖的服务出现问题时可以继续提供服务,同时数据可达成一致,信息可达,压力可控。

 

商用客机在交付前会进行一系列的严格测试,这些测试来源于设计人员对于飞机将来的使用场合,环境,以及可能面临的一些极端条件所分析出的可能存在的风险而针对性设计的,要求飞机能够承受住考验才可交付,对于应用系统的稳定性而言,道理是相通的,不过按道理来说,系统设计和风险分析应该放在一起讨论,可是很多时候我们很难有机会重头开始设计一个系统,那么当我们接手一个系统时,需要对系统进行全面的风险分析,这是实施稳定性保障的基础前提.

一般来说,风险分析需要包含几个方面:

  • 对外提供什么服务

  • 那些业务依赖本系统

  • 系统的上游有那些

  • 依赖的下游有那些,依赖的程度如何

  • 系统的部署结构是什么样的

  • 依赖什么数据,从哪里获取

  • 依赖那些资源,资源使用模型时怎么样的

  • 日常常见的维护操作是什么,都有谁参与等等

分析这些内容有什么好处呢,首先可以让我们看清系统对业务的影响情况,影响面,其次,结合日常运维动作,链路关系,资源使用模型可以推导各方面可能存在的风险点和带来的后果,比如一个依赖节点耗时上涨了,带来的后果可能是业务处理耗时整体上涨,甚至拖垮调用节点,这就是可能存在的风险点.  又比如运维人员可能会进行一些日常维护动作而缩容,这有可能导致系统出现容量风险等等.

当我们完成了风险分析,很自然的就可以进入到风险防范,治理阶段了。

风险预防

简单来说就是质量+容量+灰度+回滚。

良好的质量保障是保证系统稳定运行的重要基础,如同飞机制造过程中的质量控制,精细到每一个部件,完成后还会进行覆盖到每一个细节的测试验证一样,我们的每一个迭代,每一次变更都需要有完善的质量保障体系进行覆盖, 确保变更质量符合要求,这套体系通常包含如下内容:

  • 需求分析

  • 系统分析,设计文档产出,评审

  • 开发自测,交付测试,联调

  • 持续集成覆盖

  • 代码CR

  • 整体交付报告review

这里面每一项的目的都是为了减少出错的可能,避免bug上线.

此外,系统从建设之初就应该考虑容量模型的数据是否符合预期以及高度可复用的度量手段的建立, 毕竟大家都不愿意乘坐一架机翼载荷不明的飞机,对于不同资源使用模型的系统而言,其容量模型一般是不一样的,对于一般的在线服务应用系统而言基本上都是计算密集型,容量方面主要需要关注的是 QPS-CPU-耗时 三者的关系, 我们需要知道:

  • 目标QPS下, CPU使用是否处于安全水位之下, 响应时间是否可接受

  • 多少QPS下,CPU水位达到危险状态或耗时升高到无法接受的程度

搞清楚这两组数据,我们就知道日常情况下的集群容量以及极限情况下的集群容量,可以用于指导计算资源的配置,不至于被汹涌而来的请求压垮.

这三个因素相互制约,任何一个不达标,则整体容量不符合要求. 一般来说,获取容量模型的手段包括:

  •  获取单系统容量模型所进行的单机压测

  • 获取完整处理链路容量模型所进行的全链路集群压测

压测时,需要关注的是压测样本的仿真度问题以及服务器配置的差异,如果压测样本与真实情况偏离较大,那么获得的容量模型可能与真实情况相去甚远, 如果集群机器配置差异较大,单机压测或者不全面的全链路压测都可能给出错误的指导数据.

然后来讲一讲灰度, 首先要明确的是,无论多么经验丰富的人编写的代码,经过多么严格的测试验证, 都无法百分百避免问题遗漏, 所以变更发布一定要具备灰度和监控的能力,无论采用什么样的灰度策略, 大部分情况下都可以将问题的爆发控制在可控制的范围内.一般可能采取的灰度策略包括:

  • 按用户比例灰度

  • 内部用户灰度->外部部分用户->全量

  • 白名单灰度

  • 按区域/地域灰度等等

灰度阶段发现的问题,可能是用户的一些反馈,意见,可以快速迭代进行优化,解决,某些可能就是真实的线上问题,会对用户体验甚至资金造成影响, 这时就需要紧急回滚,因此快速回滚的能力必不可少, 这要求做到如下几点:

  • 具备良好的代码,数据版本管理能力,可以实现快速的替换

  • 提前分析好回滚的依赖性,避免出现链路某个节点回滚其他节点还保持依赖导致整体出错。

风险预警

通常来说,我们乘坐的航班,驾驶舱里的设备会实时的对机件的运行状态进行监控, 地面雷达也会不断的监控飞机的动向,一旦出现异常则进行快速应对, 我们的系统也是一样的,必须具备对运行状态的监控能力, 合理有效的监控体系能够帮助我们及时发现存在的问题,进而采取进一步的措施来进行处置,这种监控体系通常是多层次的:

基础资源监控

  • 网络

  • 存储

  • 服务器硬件,系统资源

  • 通用中间件

  • DNS

  • 流量调配

应用服务监控

  • 业务量

  • 来源分布

  • 结果

  • 耗时

  • 成功率

  • 依赖调用量

  • 依赖调用成功率

  • 依赖调用耗时

应用基础资源监控

  • 服务器数量,分布

  • 服务器内存

  • 服务器CPU使用

  • GC情况

  • 线程池使用情况

  • DB调用量

  • DB调用耗时

  • IO

  • 磁盘占用

链路监控

  • 业务整体成功率

  • 业务链路处理整体耗时

  • 报错量监控

  • 问题节点监控

  • 等等内容

在这些监控内容的基础上, 通常又要按照部署的集群,区域,单元进行逻辑化的监控单元,便于进一步定位问题范围.

在监控的基础上,会配置各种各样的报警,关注各种指标的变化情况,每当出现异动都会触发报警,通常这些报警都是基于专家经验人为设置的,这样的典型结果是一方面我们可以知道现在系统上出现了异动,另一方面是这种异动可能因为业务发展带来的量级变化,偶然的抖动,不同时间段的差异等等原因带来海量的噪音,引发报警疲劳,面对这种问题,通常采用下列办法进行优化:

多监控点,多层次关联,低层次监控关联高层次监控,比如监控DB调用量的监控点与业务调用量监控点进行关联,当DB调用增加时可以知道是由于业务量上涨导致,快速给出定位原因,避免不必要的恐慌, 这种关联的优势还在于为问题紧急程度提供评估, 比如某个依赖系统down掉了,对它的监控报警点关联到整体业务成功率报警点上,如果报警信息上明确告知没有影响到整体成功率,那么一般无需采取一些极端的应急手段,反过来,则需要立即着手快速止血。

另一方面,引入一些智能算法,通过对业务规律,历史数据的分析,学习,输出一套自我更新,自我迭代的监控机制,可以自适应的识别那些常态化的变化因子,从而有效降低无效报警数量,达到精细化,高效的监控报警效果.

应急处置

 所谓应急处置,则是指系统确实出现了异常情况,通过某些措施手段快速止血,恢复的过程。如同飞行员在飞机出现问题时决策返航,切换控制系统,关闭失效发动机一样,需要快速掌握情况后决策出合理的下一步动作来消除风险。

      通常在接收到监控报警后,如果产生了比较严重或者可能诱发严重问题的情况,那么就需要进入应急阶段,应急处置应该是一套明确的机制和规范,指导人员进行快速有效的应急,这包括:

人员如何分工:

     谁负责排查,谁负责关注业务运行情况,谁负责信息同步,谁负责决策,谁操作止血等等,并非所有的事情都需要专人跟进,而是明确角色,可以一人担负多个角色.

如何决策:

     什么样的情况下,应该采用何种手段进行止血处理,影响是什么,什么样的情况下可以进行恢复操作.

预案准备:

     面对什么问题可以使用什么手段进行处置,达到止血的效果,通常而言,预案会包括回滚,降级,切换,扩容,重启等等,每一种预案都会针对特定的问题,也可能多重预案联合使用,视具体情况而定.

回顾复盘:

     处置完成后收集那些信息,如何总结和产出优化提升任务.

     应急处置机制应该在做在事前, 团队成员充分学习和掌握,并且每次应急后进行总结,对不足的地方进行提升,总之应急就是争分夺秒,高效的协作和准确的处置可以挽大厦于既倒。

当我们分析完系统的风险,相应的建立了监控体系,应急处置机制,是不是就高枕无忧了呢,答案肯定是否定的,事物总是在变化之中, 风险点可能随着系统演变而变化, 监控可能随之时效或遗漏,预案可能失效,人员经验可能过时,精气神可能懈怠, 如何应对?  我们还需要常态化的演练机制,不断的吸收出现过的问题进行反复的演练,一如飞行员要定期培训,考核,机组要经常进行应急,疏散等演练一样,通过演练,我们可以达到以下效果:

  • 验证监控系统有效性

  • 验证预案有效性

  • 验证团队应急机制执行,掌握情况

  • 为潜在问题摸索应对方案

这一切都是为了保证整套稳定性保障的体系可以高速运转, 而演练,应该注重如下几点:

  • 仿真度,应该尽可能的贴近真实问题现象和触发原因

  • 突然性,让团队成员在最真实的状态下进行反应

  • 安全性,演练必须注重安全性,不能对真实业务造成影响

  • 即时复盘,总结做的好的,不好的,不好之处加以提升

  • 反哺,用演练不断的查漏补缺,提升整个体系保障能力的厚度

 

系统稳定运行是我们开发者的底线,我本人也长期奋战在维护系统稳定的战线上,深知其中的艰难,敏锐的洞察力,警觉感,执行力,敬业精神是每一个稳定性保障成员的必要素质,完善的风险防控体系是我们手上的利器,守住底线,不要让自己,让队友失败。

愿意加入本团队的同学欢迎投递简历,邮箱junze.yu@alipay.com

 往期推荐:

  •    ……

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

系统稳定性设计原则:简单、冗余、标准化、健壮 的相关文章

  • linux下python组织自定义模块,解决模块存在无法导入

    问题背景 在windows下使用pycharm开发python程序 包导入正常 但是移植到Linux却说包找不到了 No module named xxx python包路径搜索机制 python搜索包的路径存储在sys path下 临时添
  • 【测试设计】使用jenkins 插件Allure生成自动化测试报告

    前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告 后来也尝试过用Python的PyH模块自己构建测试报告 在后来看到了RobotFramework的测试报告 感觉之前用的测试报告都太简陋 它才是测试报告应该有的
  • 分布式两阶段提交和三阶段提交

    随着大型网站的各种高并发访问 海量数据处理等场景越来越多 如何实现网站的高可用 易伸缩 可扩展 安全等目标就显得越来越重要 为了解决这样一系列问题 大型网站的架构也在不断发展 提高大型网站的高可用架构 不得不提的就是分布式 本文主要介绍关于
  • CSS 动画实战:创建一个漂亮的加载动画

    这篇文章 用一个实例来讲下用伪元素和CSS Animation来创建一个漂亮的加载动画 首先来看下 要实现的动画效果 先来分析下 这个动画效果是由哪几个动画组成 1 线段依次出现 2 然后红色 橙色和白色矩形依次出现 3 这些矩形出现之后
  • 微信小程序nodejs+vue高校食堂餐厅点餐订餐系统ja221

    本文以实际运用为开发背景 运用软件工程原理和开发方法 它主要是采用 语言 node js 框架 Express 前端 Vue js 数据库 mysql 数据库工具 Navicat 开发软件 VScode 前端vue elementui 1
  • 12000字解读白小T:成立1年创收1亿,单品类策略如何引爆流行?

    主笔 西兰卡普 研究员 白婷丹 Leo 西兰卡普 陆压 出品 增长黑盒研究组 研究支持 久谦中台 飞瓜数据 App Growing 前言 最近两年 当我们与新消费品牌创业者及操盘手探讨服饰赛道最新风向时 大家高频提及的不外乎是Bosie A
  • kubernetes Ingress资源管理

    k8s 对外服务之 Ingress Ingress 简介 service的作用体现在两个方面 对集群内部 它不断跟踪pod的变化 更新endpoint中对应pod的对象 提供了ip不断变化的pod的服务发现机制 对集群外部 他类似负载均衡器
  • 关于STM32的IAP与APP互相跳转

    关于STM32的IAP与APP互相跳转 之前做了一个不带系统的IAP与APP互相跳转 在网上找了资料后 很顺畅就完成了 后来在IAR集成开发环境下 IAP无系统 APP用UCOS系统做互相跳转出现了很多问题 现将IAP学习过程和实际遇到问题
  • 柏林噪声(Perlin Noise) 介绍及应用

    什么是噪声 信号处理中一般指原信号中不存在的无规则的额外信号 在处理过程中一般是我们不需要的 需要被处理掉的 噪声和信号本身无关 其频率和强弱变化无规律 噪声有什么用处 就如上面提到的那样 噪声是干扰原信号的存在 在信号处理中 我们一般都希
  • Spring基础总结

    Spring基础总结篇 1 获取 Spring 的 IOC 容器 并根据 bean 的 id 获取注入对象 1 通过 BeanFactory 获取 Bean 2 通过 ApplicationContext 应用上下文获取 Bean 2 Be
  • 玩转Mysql系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第7篇 环境 mysql5 7 25 cmd命令中进行演示 代码中被 包含的表示可选 符号分开的表示可选其一 本章内容 详解排序查询 详解limit limit存在的坑 分页查询中的坑 排序查询 order by 电商中
  • RedditVideoMakerBot 视频制作机器人自动生成视频搭建教程

    https github com elebumm RedditVideoMakerBot搭建教程 RedditVideoMakerBot视频制作机器人 有些在抖音 快手上的视频获得了数百万的观看次数 你仔细分析他们的视频 他们唯一做的原创事
  • 修改pip国内源

    修改pip国内源 修改源方法 临时使用 可以在使用pip的时候在后面加上 i参数 指定pip源 例如 pip install scrapy i https pypi tuna tsinghua edu cn simple 永久修改 linu
  • 【计算机视觉】直接线性变换(DLT)求解P矩阵(3 加入坐标的归一化)(附MATLAB代码)

    引言 本来上一篇帖子就已经达到了精度要求 不过经过同学提醒才发现老师的作业要求中有要求考虑归一化 emmmmm 坐标归一化 进行归一化的必要性和方法参考 计算机视觉中的多视几何 中的描述 上面的是从 2D到2D的结论 不过与从3D到2D的结
  • el-table添加行/单元格样式

    文章目录 一 官方文档释义 1 row style cell style 2 row class name cell class name 二 row style cell style的使用 1 row style 使用Object 使用F
  • 前端基础第一天:HTML常用标签知识点

    学习目标 理解 相对路径三种形式 应用 排版标签 文本格式化标签 图像标签 链接 相对路径 绝对路径的使用 1 HTML常用标签 首先 HTML和CSS是两种完全不同的语言 我们学的是结构 就只写HTML标签 认识标签就可以了 不会再给结构
  • antdv表格的rowSelection设置单选禁用选中等

    这个问题在项目中已经遇到过两次了 一次为表格想实现单选 禁用等 另一次则是今天 遇上需求需要在初始化表格的时候默认选中项目 鉴于自己的记性太差 记录记录 万一哪天又遇到这个问题心血来潮来翻了一翻博客 那问题就解决了 犹记得实现表格项单选和禁
  • 决策树(信息熵、增益率、基尼指数)

    目录 前言 一 决策树是什么 二 实验过程 1 选择数据集中各个决策属性的优先级 1 1信息熵 1 2增益率 1 3基尼指数 2 决策树的构造 2 1创建决策树 2 2准备数据 2 3 读取和保存决策树 2 4绘制决策树 3运行结果 3 1
  • 升级Linux中的默认JDK的版本

    我用的Linux是 红帽企业级Linux AS版 TLF SOFT Redhat Enterprise Linux AS V4 0 UPDATE 7 DVD 因工作需要 将Linux中默认安装的Jdk 版本为1 4 进行升级 将升级的经验和
  • BigDecimal的常用方法

    一 BigDecimal概述 Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算 双精度浮点型变量double可以处理16位有效数 但在实际应用中 可能需要对更大或者更小的数进行运算

随机推荐

  • Python学习笔记(基础篇)

    目录 一 Python编程基础 1 1print 1 2 input 1 3 ASC 码 1 4注释 二 数据类型与基本运算符 2 1变量 2 2数值类型 整数 浮点数 复数 2 3字符串 2 4布尔类型 2 5数据类型转换 2 6算数运算
  • 【mysql】mysql group by分组后取每组的最小值

    方法一 非严格模式下 group by后 会取分组后多个create time 的其中一个 由于我们的 create time 时间是有序的 会取第一条 如果是无序字段 很可能取的顺序会有问题 可以在create time 前面加上grou
  • 苹果系统 macOS Mojave 10.14.4上安装 Ubuntu 18.04 双系统

    macOS Mojave 10 14 4 安装Ubuntu 18 04 双系统 0 准备工作 系统情况 1 制作Ubuntu安装盘 U盘 2 硬盘分区 3 安装Ubuntu 4 正常使用GRUB 5 调整Ubuntu设置 2019 07 1
  • Tomcat开启远程调试端口

    部署环境 Linux 亲测成功 tomcat7 bin startup sh的文件开头位置添加 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunj
  • JavaWeb JDBC

    1 实现第一个JDBC程序 在MySQL中创建一个名称为jdbc的数据库 然后在该数据库中创建一个users表 创建 数据库和表的SQL语句如下所示 CREATE DATABASE jdbc USE jdbc CREATE TABLE us
  • html前后端缓存,前后端分离系列-缓存篇

    1 我们需要在静态文件返回给浏览器的时候header中的缓存变长 这样就可以在本地秒加载 省去了带宽和加载时间 修改server js const path require path const Koa require koa const
  • 内存泄露原因和解决方案

    资料参考出自 http blog chinaunix net uid 26930580 id 3844811 html http www jianshu com p 90caf813682d 为什么会产生内存泄漏 当一个对象已经不需要再使用
  • 基于Matlab应用DBSCAN

    基于Matlab应用DBSCAN Density Based Spatial Clustering of Applications with Noise 具有噪声的基于密度的聚类方法 一 算法原理 Matlab中的统计与机器学习工具箱 Th
  • SuperSocket实战手把手教程:一个完整的SocketServer项目

    SuperSocket系列教程 1 SuperSocket基础 一 基本概念 2 SuperSocket实战手把手教程 一个完整的SocketServer项目 目录 一 项目场景 1 Visual Studio新建项目 2 自定义自己服务器
  • pre loader简单分析

    ZZ from http blog csdn net ly601579033 article details 48318239 大致的流程图如下 上电后RESET ARM核开始执行Boot ROM 具体操作有 代码固化在ROM中 1 初始化
  • 【软件硬件】相机标定(Camera calibration)原理、步骤

    转载来源 https blog csdn net lql0716 article details 71973318 locationNum 8 fps 1 在图像测量过程以及机器视觉应用中 为确定空间物体表面某点的三维几何位置与其在图像中对
  • 使用OpenGL实现的光线追踪器示例

    使用OpenGL实现的光线追踪器示例 光线追踪是一种计算机图形学中常用的方法 它可以模拟光线在三维空间中的传播和反射 在本文中 我们将介绍如何使用OpenGL实现一个简单的光线追踪器 在本例中 我们将创建一个场景 其中包含一个球体和一个平面
  • flutter a .dex file cannot exceed 64K

    第一步 添加multidex 第二部 添加multiDexEnabled 构建运行完事
  • 获取下拉菜单值

    function getSelectVal ele var selectedIndex ele selectedIndex var value ele options selectedIndex value return value
  • oracle生成编号(首字母+YYYY-DD-MM+4位序号)自动增长,4位序号达到9999,在从1001开始。

    今天写业务的时候遇见需要系统生成13位的编号 规则编号按一个大写字母 YYYY MM DD 4位序号组成 数据库用的oracle 所以就打算用序列实现 下面是实现方式 1 先创建序列 create sequence contact seq
  • vue2.x 插件的开发

    前言 第一次好好学习插件的开发 有什么不正确的地方麻烦指正 另外写这篇文章 纯粹是当作自己的学习笔记 插件 插件通常用来为 Vue 添加全局功能 插件的功能范围没有严格的限制 一般有下面几种 添加全局方法或者 property 如 vue
  • 如何查看和修改操作系统字符集

    在Windows平台下查看和修改字符集 一 查看字符集 chcp 二 修改字符集为936 chcp 936 简体中文 可以得到操作系统的代码页信息 你可以从控制面板的语言选项中 可以查看代码页对应的详细的字符集信息 linux下查看和修改字
  • JavaScript 手写深拷贝

    深拷贝 深拷贝就是要拷贝的对象内的所有引用类型的属性进行完整的拷贝 也就是说拷贝出来的对象和原对象之间没有任何数据是共享的 所有的东西都是自己独占的一份 三步实现深拷贝 第一步 判断入参是值类型还是引用类型 值类型直接返回 if typeo
  • 数字图像处理课程设计-疲劳检测系统

    文章目录 数字图像处理课程设计 疲劳检测系统 前言 一 课程设计任务 二 设计框图 三 准备工作 四 任务流程 视频预处理 4 2图片分割 五 结果 六 项目总结 数字图像处理课程设计 疲劳检测系统 前言 此系统基于MATLAB设计 核心思
  • 系统稳定性设计原则:简单、冗余、标准化、健壮

    作者介绍 淇公 蚂蚁金服技术专家 热爱java和一些函数式语言 长期关注系统稳定性领域 因为base在分公司 需要经常去总部出差 所以搭乘飞机成了家常便饭 很多时候坐在飞机上会不由的感叹 设计制造这样精密复杂的机器的那帮人真的是了不起 他们