内聚就是,一个模块之间,各个组件、各个类之间的关系,耦合就是一个模块和另一个模块或者多个模块之间的交互关系。
边界分多层,包含系统边界、领域边界;子系统(子域)边界、模块边界、聚合边界;分层边界。
可以通过DSSA、ABSD、定制的方式对边界进行划分。
(1)功能内聚:功能模块中,每一个组成部分都执行同一个功能并且只执行这一个功能。
(3)通信内聚:模块各部分使用相同输入或输出数据,本身两个部分并没有什么相同的功能。比如说通过ID查询用户的基本信息和用户的订单信息,输入是相同的。
(4)过程内聚:模块各部分受同一控制流支配。
(6)逻辑内聚:模块内各组件逻辑功能类似,逻辑的处理由传输给模块的判断参数来确定(flag字段标识)。
(7)偶然内聚:模块中各组成部分彼此没有关联。
(2)数据耦合(推荐):两个模块之间,用数据值(参数)进行耦合。可以是应用的直接调用,可以是API的发送,可以是消息队列的沟通。这种耦合是模块间影响非常小的耦合。
(6)公共耦合:一组模块都访问同一全局数据区。公共耦合是一种不良耦合,它给模块维护、修改带来障碍。公共耦合的弊端:软件可理解性降低,模块间关系复杂;公共软件可维护性降低,修改变量名和属性困难;软件可靠性降低,公共区域和全部变量无保护措施。
(7)内容耦合:一个模块直接操作或修改另一模块的内部数据。这就意味着一个模块不通过正常入口访问另一个模块,这是最糟糕的耦合清空,必须避免。
一个模块对另一个模块的调用。一个模块向另一个模块传递的数据量。一个模块施加到另一个模块的控制的多少。模块之间接口的复杂程度。
多用接口隐藏实现的细节。遵循一个定义只在一个地方出现。(公共的model最好放在公共模块中)少用全局变量。少用public,多用private关键字,对外减少暴露。多用设计模式。避免直接用SQL语句操作数据库,尽量封装一个Dao层。避免直接操作或调用其他模块或类(内容耦合),如果要调用尽量用API方式。尽量使用数据耦合,少用控制耦合。限制公共耦合的范围。
模块的功能划分尽可能的单一(单一职责原则)。模块只对外暴露最小限度的接口(接口隔离原则)。一切向功能内聚靠拢,杜绝偶然内聚。
对于无状态应用来说,多个节点进行克隆复制,通过负载均衡器可以很容易的进行服务器的扩展。对于有状态应用,我们可以先将状态剥离(比如说Session使用redis共享)。
使用横向克隆的方案,可以很轻松的实现应用的弹性扩缩容,根据当前服务器压力动态扩缩容;实现性能规划,测试环境1台服务器支持1000QPS,生产上就意味着10台服务器支持1wQPS;实现业务解耦,业务规模扩大可以扩充服务器来进行支撑;实现环境同构,测试环境与生产环境参数一致,不存在环境不一致的情况。
前端应用,对URL进行拆分,也就是微前端。后端应用,拆分为子系统、模块、聚合,实现应用的解耦。后台数据相应的进行Y轴分割。
使用服务分割,可以实现服务互不干扰,实现服务互相隔离。实现资源迭代分配,应用的功能逐渐完善,服务器资源也对应着慢慢增加。实现数据一致性,相同的业务都将数据分配在相同的服务器上,所以数据一致性可以得到保障。但是缺点,业务耦合性强,需要根据不同的业务进行动态调整。
根据用户UserId分割(hash或者其他),多节点水平复制。根据地理位置分割,Set单元化。根据产品ID分割,SPU/SKU。
使用特征分割,可以加速查询搜索。Z轴也可以支持有状态服务。实现业务解耦。实现环境同构。
传统的关系型数据库,如果采用强一致性,但是只能扩展有限的几个节点。如果想要实现数据库的水平复制,通常来说会实现读写分离,或者1写多读(binlog+cdc)。NoSQL数据库,天生就支持多副本replica。缓存读取也可以支持多副本横向扩展,比如redis。
水平复制可以通过CAP(最终一致性)、CDC便捷复制来实现数据的高可用。但是多副本会造成存储空间的浪费,相当于用空间来换可用性。
配合应用,对业务进行库表分割。表、库享有独立的数据库集群/节点。库表分割有点相似于微服务的按业务分割,相当于数据跟着服务走。
通过库表分割,可以实现数据故障隔离、对资源进行迭代分配,数据的强一致性。但是业务耦合性很强,每个库与业务强绑定。
通过各种key的id,通过哈希取模来决定数据存放在哪一个数据区。
比如说传统的关系型数据库,分库分表可以使用的MyCat。非关系型NoSQL数据库,天然支持多分片(shard/chunk)。
通过哈希取模的方式,可以加速查询搜索,扩展无上限,不需要考虑业务,每一个分片都是强一致性。
通常来说,生产环境会通过XYZ轴混合使用。
康威定律是马尔文·康威在1967提出的,写在论文里发表出来。它的出名是被“软件开发神书”《人月神话》引用并总结成四条定律,成为软件架构设计的神律。
第一定律,设计系统的架构受制于产生这些设计的组织的沟通结构。沟通成本=N(N-1)/2,N代表沟通的总人数沟通的问题会影响系统设计,软件架构最终会是沟通(组织)结构的映射。
第三定律,线性系统和线性组织架构间有潜在的异质同态特性。什么样的系统对应什么样的组织,什么样的组织设计出什么样的系统。架构由组织关系决定,架构服务于技术,同样服务于组织中的人
亚马逊的“两块披萨”团队机制。
组织中的人,每天目标一致:吃披萨。
组织人员较少:贝索斯推荐幸运数字:6、12
配合应用和数据的Y轴,通过业务的分割,对组织也进行扩展。
ITIL流程管理、ITSM服务管理、CI/CD、JAD联合架构设计、6西格玛、ARB架构评审会。
CMM是一种用于评价软件承包能力并帮助其改善软件质量的方法,侧重于软件开发过程的管理及工程能力的提高与评估。CMM分为五个等级:一级为初始级,二级为可重复级,三级为已定义级,四级为已管理级,五级为优化级。
SMART原则(S=Specific、M=Measurable、A=Attainable、R=Relevant、T=Time-bound)是为了利于员工更加明确高效地工作,更是为了管理者将来对员工实施绩效考核提供了考核目标和考核标准,使考核更加科学化、规范化,更能保证考核的公正、公开与公平。
制定的过程也是自身能力不断增长的过程,经理必须和员工一起在不断制定高绩效目标的过程中共同提高绩效能力。
目标设定:业务指标(UV、PV、交易量),系统目标(CPU、内存、磁盘、网络),应用目标(TPS、QPS、Session、并发数)。
规划方法:容量评估方法(基线、水位)。(在此不展开讨论,后续单独成篇讨论)
实战:压测、监控和预测。
测试手段:标准(历史为基),环境(QA、准生产、生产),定义(测试案例),执行(自动化),分析(统计),报告(录入),迭代(反复)。
测试核心思想:负载测试是一个长期的过程。
测试目标:发现系统的拐点(失效点)、远高于正常负载。
测试手段:目标,关键服务(关键服务、负载测试瓶颈),负载(大量测试数据),环境(减少差异),监视,执行,分析(录入)。
性能监控:(利用普罗米修斯)时序数据,纬度聚合,性能指标,报表告警。
链路监控:全局唯一ID——TraceID、SpanID、DyeID等,出错归因,延时瓶颈。
业务追踪:业务、应用、系统关联、告警去重。
APM监控+扩缩容决策引擎(AutoScale策略)+资源管理(虚拟机、容器、网络负载、Serverless)。
通常我们把读缓存成为Cache,写缓存称为Buffer。
什么是写Buffer?比如说每次写100字节的一个IO,我们可以把十个写Buffer合成一个,也就是1k,一次性写进去,这就是写缓存的一个技术实现。写缓存三大技术:网络缓存、应用缓存、对象缓存。能用网络缓存就用网络缓存解决,不行才用应用缓存,最后才是对象缓存。
什么是读缓存呢?读缓存的技术比写缓存远远复杂的多,也是我们主要他讨论的。
网页缓存:在用户浏览器中缓存的网页数据(Cache-Control),用户打开浏览器不需要访问网站,直接从浏览器读取到缓存打开网页。
CDN缓存:边缘缓存(Edge),CDN根据用户所在的位置,解析到最近的机房的IP地址,访问最近的服务器,提高响应速度。在CDN节点上做缓存,也是一种缓存的实现方式。
使用异步,可以:减少等待:磁盘、SQL、API、URL;Y轴扩展:微服务解耦、Y轴扩展更随意;削峰填谷:泊松分布、排队等待。
X轴扩展:吞吐能力和QPS明显提升;Y轴扩展:出错率明显降低;Z轴扩展:延时降低、TPS/QPS明显提升。
使用缓存:需要搭建CDN、多机房、额外的内存消耗等等,提高了大量的成本。使用异步、分布式:需要额外拆分新的服务,使用新的中间件,增加了系统的复杂性,提高了开发成本、维护成本、服务器成本。
将不重要的功能暂停,以全力应对关键业务。
CAP理论,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、PartitionTolerance(分区容错性),不能同时成立。
虽然CAP理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择P(分区容忍)要素,因为网络本身无法做到100%可靠,有可能出故障,所以分区是一个必然的现象。如果我们选择了CA而放弃了P,那么当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回error(例如,当前系统不允许写入),这又和A冲突了,因为A要求返回noerror和notimeout。因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。
对于多数大型互联网应用的场景,主机众多、部署分散,分区容忍性是基本要求,否则就失去了价值,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。
应用集群:Unix(PowerHA)、Linux(RedHatClusterSuite)、第三方(VeritasClusterServer)中间件集群:WebLogic、WebSphere数据集群:OracleRAC、DB2pureScale、GeneralParallelFileSystem、磁盘RAID阵列
分布式应用、分布式中间件、分布式数据库。
需要解决一致性、脑裂、雪崩、击穿等问题。
(详细内容后续再谈)
第一道防线:预防。经常做数据备份、快照数据,应用与系统架构需要非常演进,N与N-1版本共存,彻底的变更审核。第二道防线:发现。全自动的系统监控,全自动的脚本,检测应用于系统的正常、异常行为。第三道防线:修复。应用与系统的回滚,一键恢复、自动恢复、快速数据恢复。
用户所有的业务系统同时在同城的两个数据中心运行,同时为用户提供服务,当某个数据中心的应用系统出现问题时,有另一个数据中心的应用来持续的提供服务。好处是服务能力是双倍的,且对用户来说不可感知。
将同一个网络扩展到多个数据中心,并且实现服务器和应用的虚拟化数据中心互联技术:随着高可用远程集群技术以及虚拟机迁移技术在数据中心容灾以及计算资源调配方面的广泛应用,在数据中心间需要大二层网络连接。(比如说移动+联通双活)
是一种独特的存储技术,使信息能在数据中心内部以及数据中心之间共享、存取或移动,从而将各种不同的存储系统联合成为单一资源。它允许位于地理上分离站点的存储系统同时进行数据存取,对客户透明,且保证了数据可靠性和可用性。
异地之间采用双活目前不够现实。因为尚无很好的技术能够实现远距离的实时数据同步。当两个站点距离超过100公里以上,数据同步只能采用数据异步的存储数据复制的方式。
指两个数据库系统可以在相隔比较远的情况下同时运行、支持相同的应用负载,并且在一方出现故障时能够迅速切换到另一方(分钟级),保证业务高可用。
技术路线选择:SAN网络层容灾。优势是数据一致性通过SAN层数据复制功能保证、适用于异构存储环境、多平台存储汇聚资源池统一管理、不占用主机资源及性能、对上层应用及数据库透明、远程异步FCIP。但是缺陷是可能是新的故障节点、可能产生性能瓶颈。(小型项目用)
技术选择路线:存储层容灾。数据一致性由存储控制器数据复制机保证、不占用主机资源及性能、对上层应用及数据库透明。
在应用处理层面上实现了完全冗余,交易通过负载均衡自动路由到不同的应用服务器,但是,应用层面上还是依赖在某一个数据库。
纸上谈兵:核查性测试(看文档)、结构化的排练(读文档)。大事化小:模拟测试(非生产)、并行测试(生产)。搞大了:全中断测试(切换和回切)。
DRP:BCP的绝对主体。其他专题:本地高可用、数据逻辑保护、系统安全运营。非技术性:人员、沟通、财务、损失估算。
SRE文化、混沌工程、监控、错误预算、业务高可用评估、系统高可用评估。
可用性(Avaliability)、完整性(Integrity)、机密性(Confidentiality)。
Zachman、P2DR、Sabsa、IPDRR、IATF。
自适应安全、网络韧性、COBIT、NIST、ITIL、六西格玛。
安全测试:SAST静态测试、IAST交互式测试、安全扫描。威胁模型:攻击树分析、DREAD风险评估。渗透测试:红蓝对抗、白帽黑帽。
人员安全(保安)、访问控制(锁、墙)、入侵检测(摄像头、看门狗)。
访问权限:责任分层、最小特权。数据加密:对称秘钥、非对称秘钥、数字签名。数据保护:数据逻辑保护、数据高可用。
网络攻击:DDoS拒绝服务、DNS劫持、重放攻击、ARP地址解析欺骗。网络防御:WAF应用防火墙、IDS/IPS入侵检测和防御、VPN/IPSEC安全通道加密、PGP邮件加密、TLSHTTP隧道加密。
操作系统安全:病毒、蠕虫、特洛伊木马、零日攻击、补丁。数据库安全:防止SQL注入、防止推理攻击。Web应用安全:防止XSS跨站点脚本攻击、防止重放攻击。
AES对称加密、PKI基础架构、JWT签名、WAF应用防火墙、IDS入侵检测、RBAC访问控制、SAML安全断言、SQL注入预防、XSS跨站点攻击防治。
基础设施(云平台或者虚拟机)、系统资源(容器)、网络引流(人才)。
应用无状态;常见编程方式为函数式编程、响应式编程;常见业务模式:事件驱动、流驱动;从0资源->无穷大。
观察(CPU等资源)、决策、执行(资源扩展)。
将有状态应用进行区分:共享磁盘模式和ShareNothing模式。共享磁盘模式->变成无状态应用。ShareNothing模式->采用合适的集群管理方式和CAP目标。
结构化数据->考虑共享数据库。非结构化数据->考虑共享缓存、对象存储、搜索引擎等。减少文件系统依赖(如CDN直接对接对象存储等)。
CAP-优化可用性和分区性,弱化一致性。集群管理-优化枚举、仲裁、阶段提交、副本、分片管理。资源预配置。