软件架构设计:属性、原则和实践伍活欣harrywu304@qq.com一个人一篇论文RoyThomasFielding博士《架构风格与基于网络的软件架构设计》。Fielding博士是HTTP和URI等Web架构标准的主要设计者。也是Apache服务器的主要开发者。定义和提出Restful架构风格。什么是架构对系统运行时元素的抽象.关于抽象抽象原则是架构设计的核心原则ClientCacheProxySource什么是架构风格一组应用在设计上的约束架构属性•性能-Performance•可伸缩性-Scalability•简单性-Simplicity•可修改性-Modifiability•可见性-Visibility•可移植性-Portability•可靠性-Reliability•运维友好性–Operations-friendly•安全性-Security架构属性性能Performance性能•网络性能–NetworkPerformance–吞吐量throughput(TPS)•用户可察觉的性能–User-perceivedPerformance–延迟latency–完成时间completion•网络效率–NetworkEfficiency–网络交互频率和效率案例11234568910点击加载更多性能首先取决于应用的需求,然后是所选择的交互风格,然后是实现的架构,最后是每个组件的实现。案例2小明要给客人沏茶,需要多长时间?用并行代替串行案例3•论坛图片加载:imgoriginal==点击图片查看幻灯模式src=•点击数更新、个人积分更新、个人列表更新等等•推荐列表的获取(同时需考虑SEO的需要)用异步代替同步AMIAMD案例4分流轻事务和重事务排队请取号:现金业务非现金业务公积金业务案例5减少稀缺资源的占用和占用时间•启用Nginx传输压缩,降低下行带宽占用;•启用独立的静态资源域名,降低上行带宽占用;•一段相册的老代码:Connectioncnn=DbService.getConnection();存储原图;制作大中小图;…statement.exec(sql);cnn.close();案例6尽量重用高成本资源•数据库连接池;•采用长连接;•SPDY协议对TCP连接的复用;•JVM对域名解析结果的缓存;案例7尽量用内存操作代替磁盘和网络操作•各种层级的缓存策略;•合并多个点击数更新请求再更新到DB;•MQ驱动合并多个消息异步发送;案例8尽量减少网络交互次数•就近访问:CDN、浏览器缓存、本地缓存;•中央配置本地缓存;•批量提交;•压缩传输;原则回顾•性能优化应首先考虑需求的优化和交互的优化•用并行代替串行•用异步代替同步•分流轻事务和重事务•减少稀缺资源的占用和占用时间•尽量重用高成本资源•尽量用内存操作代替磁盘和网络操作•尽量减少网络交互次数架构属性可伸缩性Scalability可伸缩性架构支持大量组件或大量组件之间交互的能力弹性案例9结点数Mod震荡率Ketama震荡率15049267353752548024583176861378713889109901110919020406080100120147101316192225283134374043464952555861646770737679828588919497modMissRateketamaMissRate取模和一致性哈希的震荡率对比测试NodeIncrement:1,SampleSize:10W,Key:UUID,Hash:Ketama可伸缩性•简化组件•分布式集群•用规则代替映射•选用弹性好的路由算法•善用负载均衡和代理•配置弱中心化•实现运维自动化:DNS自助、LB自助、VM自助、运行环境构建、代码部署、监控架构属性简单性Simplicity简单性•分离关注点原则-分层设计-面向接口而不是实现-分离对象的使用和创建IOC-分离应用的业务逻辑与系统级服务AOP•通用性原则•可理解性架构属性可修改性Modifiability可修改性•可进化性–Evolvability–纵向升级•可扩展性–Extensibility–横向扩展,添加新能力•可定制性–Customizability–临时性提供非常规服务的能力•可配置性–Configurability–部署后对组件修改的能力•可重用性–Reusability–架构元素被其他应用重用的能力静态动态可修改性•版本化一切:接口版本、协议版本、序列化版本、消息版本等等•微内核+插件化•表达式支持、按需脚本和自定义实现•预留Hook和扩展点•配置文件、配置接口、控制台响应•细粒度切割然后组合成粗粒度•解耦合和遵循公共规范,如OSGI、JSON-RPC等架构属性可见性Visibility可见性可调式、可仲裁、可监控、可测试的能力案例10•Memcached中存储序列化的Java对象VSBSONVSJSON;•RPC序列化对象采用Hessian2二进制VSJSON;•RPC协议采用HTTPVSICE;•遵循Restful风格的Http请求VS普通Http请求;•启发式控制器VS简单规则控制器;为了创造非常复杂的事物,放弃一定的控制和可见性是必要的可见性•使用可读性强的消息体和协议;•使用行业支持性广的规范和协议;•在设计之初就预留监控口、健康检查口和调试口;•在关键业务逻辑预留Info或Debug级别日志信息;•日志级别可动态调整,范围可控;•支持运行时的人机交互;•支持运行时按需监控和调试;架构属性可移植性Portability可移植性•遵循规范;•避免使用一些运行环境专有的特性;•尽量避免本地依赖;•使用虚拟机机制,如JVM;•还是抽象;架构属性可靠性Reliability可靠性可用性Availability健壮性Robustness案例11案例121234512345511122233344455两种不同的一致性哈希实现可靠性•为每个服务制定SLA,实时度量并及时报警;•功能可降级可开关;•区分主体功能和装饰功能,装饰功能可异步可降级可关闭;•为每一级入口添加分流、限流和配额控制器;•避免单点,增加冗余;•多活;•做好充分的故障预期;可靠性•充分验证的故障响应机制,如Failover、Failfast、Failback、Failsafe;•去中心化或弱中心化;•考虑部署隔离,甚至物理隔离;•同城多机房,异地备份;•制定备份策略,冷备、热备、增量、全量、异地、多介质;•充分考虑人机交换的办公障碍;架构属性运维友好性Operations-friendly运维友好性•Faultrecovery;•Quickservicehealthcheck;•Allowemergencyhumanintervention;•Redundancy,avoidsinglepointsoffailure;•Keepdeploysimple;•Supportsingleserverdeployment;以下内容摘录自:JamesHamilton:OnDesigningandDeployingInternet-ScaleServices运维友好性•Useperformancecountersforalloperations•Auditalloperations;•Trackallfaulttolerancemechanisms;•Supporta“bigredswitch”;•Controladmission;•Rampupsupport;运维友好性•Recordallsignificantactions;•Makeallreportederrorsactionable;•Giveenoughinformationtodiagnose;•Chainofevidence;架构属性安全性Security引用说明•RoyThomasFielding:架构风格与基于网络的软件架构设计•JamesHamilton:OnDesigningandDeployingInternet-ScaleServices谢谢!