我在架构设计和代码开发中的一些常用原则

简介: 在日常的开发和设计过程中,大家对技术设计上的一些问题往往会面临很多的选择,不同的人会有不同的选择。本文介绍的就是我在工作中遇到的一些问题而总结和使用到的一些常用原则。

 

image.png

 

不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己应该怎么做。我一生中学到的最重要的东西是一种以原则为基础的生活方式,是它帮助我发现真相是什么,并据此如何行动。

——瑞·达利欧(Ray Dalio)

在日常的开发和设计过程中,大家对技术设计上的一些问题往往会面临很多的选择,不同的人会有不同的选择,每每如此,我都会尝试着问自己:我做出选择和判断背后的原则是什么?

经过这么多年的发展,在软件设计过程,目前沉淀下来的原则有很多,但很多情况下,很多原则为了普适性,总结得会比较抽象,一旦太过抽象,对原则的解释和理解就会因人而异,譬如:高内聚低耦合原则,大家都懂,但是如何落地和执行却是很难说完全达成一致。因此,需要针对一些实际的场景中的问题去总结和补充,在大的原则下具化形成大家容易理解一致的相对明确原则。

本文介绍的就是我在工作中遇到的一些问题而总结和使用到的一些常用原则。

一 常用原则总结

1 分层设计相关原则

单向依赖原则

原则上只允许较高层次依赖较低层次,不允许反向依赖。

我们部门是为B类企业提供金融解决方案的技术部门,针对我们部门,在金融平台层系统不能反向依赖业务产品层系统。同一层的金融平台层系统之间的依赖不进行限制,但会尽量减少同层依赖。

另外,我们在解决底层依赖的高层中沉淀了几种基本方式:

  1. 系统依赖转换为数据依赖;
  2. 接口依赖,通过底层定义SPI,业务层实现,这种做法其实是不得已为之,同时,我们在设计过程中还是尽可能避免走这条路;
  3. 通过事件机制解耦依赖。

无循环依赖原则

系统设计时,尽量减少系统之间的依赖,同时需要避免系统之间出现循环调用。

这是微服务场景下最容易出现的一个问题,尤其是同层的领域系统之间的调用,导致系统容易出现循环调用,循环依赖带来的一个严重的问题是影响系统的发布和部署问题。

避免跨层调用原则

较高层次不允许之间跨层调用底层。

软件设计中进行分层的一个重要目的是通过分层屏蔽底层的实现细节,如果出现跨层相当于把底层的实现直接暴露了。譬如门面服务层,绕过领域服务层,直接调用DAO层进行数据读写操作,一旦需要重构修改原有的DAO层接口,就发现升级改造成本巨大,我不知道有多少个团队也面临过这种痛苦。

单一职责原则

该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。

这个原则虽然提出时是解决类的职责定义问题,但实际上在对模块的划分上也有指导意义。该原则虽然很简单,但是往往也容易被忽视。

在最近的项目中,我充分体会到这个原则的作用,我们部门的金融网络系统主要解决机构标准化对接问题,我们将系统分为了上下两层,下层通过标准化的接口对接机构,提升机构跨产品的复用能力;上层是产品扩展层,通过提供标准接口给到上游的业务产品层,支持同一个产品接入多家机构,屏蔽机构差异。我们判断一个功能到底属于机构对接层,还是产品扩展层的一个简单的原则是:如果新增一家机构,能否做到只影响机构对接层,而保持产品扩展层代码不改;反过来,如果新增一个产品,是否能做到只修改产品扩展层,机构层能否不改代码。同时,为了避免这个原则被突破,我们甚至在机构对接层的代码中,去除了所有和产品有关的参数,这样,根据产品定制的逻辑天然无法放到这一层。

数据冗余

架构设计应该使得系统中数据的冗余最小。

譬如我们在实践过程中,接口设计时,在Javadoc上强制指定接口的必传参数,尽量做到最小集,减少上游系统使用接口的成本。另外要求在接口实现时,提前进行参数校验,不让不满足要求的数据冗余到系统中。

为了提高系统性能,备份节点和子系统/模块必要时需要对数据进行缓存,当发生变化时,必须有相应的机制保证缓存数据的一致性和有效性。

2 质量属性相关原则

数据安全

这块在我们金融业务部门中尤其突出,金融由于其特殊性,往往需要收集大量的客户真实和隐私数据,数据安全是设计中需要重点考虑的问题,通常我们会主要关注以下三个方面的问题:

  • 数据存储安全:敏感数据加密、日志输出脱敏。
  • 数据传输安全:包括加密、传输通道规范,最少字段传输(够用原则),尤其是我们金融部门,需要将数据输出给到外部第三方机构情况比较多,这块上面会控制比较严格。
  • 数据输出展示:前端展示需要防止水平越权,另外,前端的展示可以埋点和方便数据采集。

3 资损防控

  • 可核对和可监控:上下游系统的数据模型核对关联关系简单、稳定(具备通用性,和产品无关)。
  • 可熔断:对关键资损链路需要做到可熔断。

对金融技术部门而言,资损防控是第一位,而我们在实际过程中发现,由于前期的一些系统在设计之初没有考虑资损的防控,导致核对或者监控的成本很高,因此,在后来的系统数据模型设计时重点会去review是否具备可核对。

4 并发控制

  • 悲观锁:代码编码规范——一锁二查三更新。
  • 乐观锁:必须在事务内更新。

5 热点问题

避免流量倾斜,导致单台机器/单个数据表/数据库集中读写。

这个需要在设计时充分提前预判业务的发展规模和系统的容量问题。在实际实施过程中,我们会提前按照3~5年左右的业务规模来设计。

6 数据倾斜

分表分库规则在设计时需要考虑数据分布均匀,避免单库或者单表数据倾斜。

数据倾斜这个在之前踩过比较大的坑,在系统设计之初没有结合业务场景去考虑系统的数据存储层设计,导致数据出现严重倾斜,数据库操作出现瓶颈,现在是我们在设计存储层方案时必须要考虑的一个原则。

7 性能原则

可压测:对性能要求高的链路,需要做到可以压测。

这个主要是由于每到大促就需要重新梳理和改造压测链路,耗时费力,苦不堪言。

8 事务控制相关原则

  • 优先使用编程式事务:为了更好的控制事务,一般要求使用编程式事务,避免潜在的跨事务问题。
  • 事务更新需要保证顺序一致性:强一致要求还是最终一致,强一致是否会涉及到跨库,事务操作时需要相同记录的更新顺序保证一致。
  • 事务中不进行远程调用。

9 一致性相关原则

  • 区分系统调用错误和业务失败:远程调用失败,不代表下游系统没有接收请求,更不能做为业务失败依据,需要严格区分系统调用错误和业务失败。
  • 可重试:任何一行代码执行时都有可能因系统重启而中断,所以需要支持可重试。
  • 异步处理必须增加核对:最终一致性离不开恢复重试策略,也需要有系统间数据核对用于及时发现数据不一致,同时在核对时需要增加处理时效的监控,及时发现长时间未处理成功的数据。

二 API设计相关设计原则

1 水平越权控制

API设计时需要考虑防范水平越权。

目前我们的做法是,从前端到后端,每层都需要进行越权校验。通过从接口设计层面防控,避免某层出现疏忽导致越权的事件发生。

2 接口幂等控制

调用方必须提供用于幂等控制的参数,为了控制幂等,同一个请求的幂等参数不变。

在血泪史上,由于接口不幂等导致的问题太多了,这个目前基本上已经成了部门在接口设计上的共识。

3 兼容性原则

API升级和调整,需要兼容老的版本。

为了保证接口可以升级,我们对接口的设计就会存在比较高的要求,譬如接口参数中不能使用枚举,不能使用Java基础类型等,同时也要求接口设计需要具备一定前瞻性和通用性,尤其对于面向业务领域的接口设计,更要求对该领域的业务知识有比较多的了解。

当然还有一些原则在《Java开发手册》中已有叙述,这里就不在赘述。

三 总结

本文介绍了我们在系统设计和开发实际场景中总结出的一些原则,通过这些原则的总结和沉淀,可以在后续出现同类问题时做出相对正确的选择,避免重蹈覆辙。另外,通过在大的原则下进行具体化和明确化,能够让大家容易达成一致,让架构方案更容易落地,不走偏。

另外,无论是在生活上还是工作上,建议多从成功的经验或者失败的教训中去总结,形成自己的原则,丰富自己的决策系统。这是《原则》这本书给我带来的一个比较大的启发。

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

坚持自主创新,凌波微步完成数千万A轮融资,加速半导体产业

随着5G、互联网、大数据、人工智能以及汽车电子等新技术、新产品的广泛应用,半导体产业已成为国民经济的基础性支撑产业。它是支撑经济社会发展,保障国家安全的战略性、基础性和先导性产业,其发展程度是衡量一个国家科技发展水平的核心指标之…

当程序员具备了抽象思维

简介: 若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。 作者:张建飞 若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽…

平板电脑连接投影仪_交互式触控幼教白板如何与平板进行连接-微幼科技

现代智慧教学中离不开智能产品的辅助,电脑、平板就是其中之一。然而这两种电子产品的显示屏尺寸太小,并不能用于多人教学中。而55寸甚至上百寸幼教白板的出现,则可以解决多人互动教学的问题。那么,交互式触控幼教白板如何与平板进…

搭载了HarmonyOS 2的华为nova9,有哪些眼前一亮的功能?

9月23日,华为正式发布了nova9系列手机。作为年轻人的鸿蒙影像旗舰,nova9系列搭载了面向万物互联时代的HarmonyOS 2,沿袭nova品牌的年轻潮美基因,聚焦年轻人群的影像社交需求,在外观、影像、快充等多方面带来了创新突破…

谈AK管理之进阶篇 - 如何有效控制云上[最后一把密钥]的风险?

简介: 上一期“谈AK管理之基础篇”,我们讲了如何规范的进行访问密钥生命周期管理。通过分出不同权限的阿里云RAM子账号,将不同的权限分给不同的用户,这样一旦子账号泄露也不会造成全局的信息泄露。但是,由于子账号在一…

备案域名绑定服务器后 提示需要备案_小程序开发需要多少钱?

现在越来越多的企业想通过微信小程序来宣传产品,为什么小程序那么火爆呢?奥晶科技为您解答,其优点不言而喻:1. 小程序建设的成本比APP建设成本低;2. 小程序能紧跟市场发展潮流,随时更新功能;3. …

Nacos配置安全最佳实践

简介: 本文讨论了自建Nacos和阿里云MSE的配置安全原理。并提出配置安全最佳实践。 作者:鲁严波 前言 配置管理作为软件开发中重要的一环,肩负着连接代码和环境的职责,能很好的分离开发人员和维护人员的关注点。 Nacos的配置管理…

云原生之上,亚马逊云科技发布多项容器与Serverless服务,持续发力现代化应用

亚马逊云科技持续发力现代化应用领域,在中国区域新推多项容器与Serverless服务及功能 在中国区域推出Amazon ECS Anywhere、Amazon Lambda容器镜像功能以及Amazon EMR on EKS等 2021年至今已发布近50个现代化应用领域全新服务与功能 编辑 | 宋 慧 出品 | CSDN云计…

2B 领域下低代码的探索之路

简介: 低代码将成为B端服务领域的基础设施,必将颠覆传统开发方式,未来可期。 作者:天晟 前言 大家好,我是钉钉宜搭前端一个小团队的负责人天晟,在阿里做了五年的低代码。今天的分享我们不讲技术细节&…

启动延时缩短 50%-80%,函数计算发布镜像加速功能

简介: 容器镜像因其颠覆式创新成为云原生时代应用部署格式的事实标准。头部云厂商 FaaS (Function-as-a-Service) 服务如阿里云函数计算、AWS Lambda 也相继在 2020 年支持使用容器镜像部署函数,全面拥抱容器生态。 作者 | Shuai Chang 阿里云云原生 Se…

易点云在京发布璇玑调度系统 中小企业办公IT升级步伐加快

中小企业是中国经济的基本细胞。数据显示,中小企业数量占我国企业总数的90%以上,对全国GDP的贡献达65%、税收贡献超过50%、解决了75%以上的城镇就业。 这些规模庞大的中小微企业的IT基础设施水平远远低于大型企业,“得过且过”是中国中小企业…

MaxCompute作业日常监控与运维实践

简介: MaxCompute作业日常监控与运维实践 监控项目作业超时运行 案例一 专用于业务团队取数的project_A ,基本都是手动跑SQL查询,每个作业执行基本不会很长时间,由于目前使用的是包年包月计算资源,为了防止单个作业…

resttemplate post提交json_SEO工具脚本,Python百度普通收录API提交工具

百度收录问题一直是不少渣渣头痛的问题,而官方其实提供了普通收录和快速收录这样的接口,直接调用官方api接口,大力出奇迹,你需要相信,你尽管seo,有排名算我输,不收录,怎么会呢&#…

OpenKruise 如何实现 K8s 社区首个规模化镜像预热能力

简介: OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之…

云原生时代,底层性能如何调优?

作者 | 宋慧出品 | CSDN云计算(ID:CSDNcloud)现在,当企业提及数字化转型,上云用云的话题时,言必谈及云原生。在云原生吞噬一切的口号下,云原生被频繁、高热度的讨论之后,其真正的价值…

4米乘以12米CAD图_孙吴镀锌钢管大棚骨架图片4-12米可定尺

孙吴镀锌钢管大棚骨架图片4-12米可定尺泽沃温室大棚管厂家是集生产销售为一体,生产经销大棚管、大棚钢管、热镀锌大棚管、大棚镀锌管、热镀锌带管。温室大棚产品广泛用于温室工程建设、大棚蔬菜基地建设、水果、水稻育秧、药材、种植、畜牧养殖等温室大棚骨架等行业…

Raft成员变更的工程实践

简介: 成员变更是一致性系统实现绕不开的难题,对于提升运维能力以及服务可用性都有很大的帮助。 本文从Raft成员变更理论出发,介绍了Raft成员变更和单步成员变更的问题,其中包括Raft著名的Bug。 对于Raft成员变更的工程实现上需要…

No.1-Apache IoTDB 随笔 - Time Series DBMS 综述

简介: 这是一篇无法一口气读完的、文字过万[正文字数14390]的长文,这是一个无法中途不上厕所就看完的、关于时序数据库的视频[时长111分钟]分享的文字整理.. 大家好,很开心能够和大家一起交流时序数据库的相关的内容 首先还是简单自我介绍一…

overflowhidden把内容遮住了怎么办_图片有水印怎么办?不用PS,有这4招就够了

大家好,我是热衷解决问题的秋小叶!俗话说,文不如表,表不如图!图片是我们在做 PPT 时经常会使用到的高频元素。阿文老师曾经说过:但是,在没有接触到正确的搜图方法前,我们往往会在搜索…

谷歌云试图抢占SAP软件云市场;企业上云迎来“黄金时代”;IBM和SAP帮助金融机构加快采用云技术……...

NEWS本周新闻回顾调查表明80%的企业在云计算方面超支云计算优化服务商Virtana公司委托研究机构Arlington Research公司对350位云计算决策者进行的这项研究发现,82%的受访者表示其所在的公司在云计算方面的支出远远超过他们的需要。Market Research Future&#xff1…