浅谈软件架构设计
架构定义:软件架构介绍
软件架构不仅仅注重软件本身的结构和行为, 还注重其他特性:使用, 功能性, 性能, 弹性, 重用, 可理解性, 经济和技术的限制及权衡。软件架构的目标:
- []可延伸性(Extensible)。在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展;[/][]可维护性(Maintainable)。软件系统的维护包括两方面:1、排除现有的错误;2、将新的软件需求反映到现有系统中去,一个易于维护的系统可以有效地降低技术支持的花费。[/][]客户体验(Customer Experience)。软件系统必须易于使用。[/][]市场时机(Time to Market)。软件用户[/]
逻辑架构:软件系统中元件之间的关系,比如用户界面,数据库,外部系统接口,商业逻辑元件,等等软件系统的逻辑架构图:[attach]813[/attach] 软件物理架构:
物理架构:软件元件是怎样放到硬件上的?软件系统的物理架构图[attach]814[/attach]
单机(One Box)简单web应用:物联网架构的演变
- []访问量小[/][]Apache/PHP/MySQL 在同一主机上[/][]瓶颈[/]
- []访问量逐渐增大[/][]Apache/PHP在Server A;MySQL在Server B[/][]瓶颈[/]
- []访问量继续增大[/][]MySQL主从复制及读写分离 (master 负责IN/UP/DEL, slave负责 SELECT)[/][]SELECT, IN/UP/DEL可以在应用程序内指定访问不同服务器 (如使用不同的handle或Db Adapter)[/][]WEB Server可能需要使用负载均衡[/][]NoSQL/Cache/CDN[/]
Memcached、Redis等广泛使用。[attach]819[/attach]架构新问题Mysql:[list=1][]Slave Lag 每台Slave数据完全一样。有的忙,有的闲[/][]数据量越来越大,单表过大,查询效率太低;[/]综合1.2 通常采用
- []memcached数据缓存 [/][]MySQL水平扩展(库表拆分)[/]
- []提高PHP代码执行效率 Opcode Cache[/][]静态文件缓存 Squid/Varnish / CDN[/][]负载均衡[/]
- []高可用[/][]高性能 [/][]可扩展 [/][]监控[/][]成本控制[/]
分布式系统概念分布式系统架构
What is a Distributed System?“一个分布式系统是若干个独立的计算机的集合,但是对该系统的用户来说,系统就像一台计算机一样。”两方面的含义:[list=1][]硬件方面:各个计算机都是自治的 [/][]软件方面:用户将整个系统看作是一台计算机 [/] 分布式系统定义:
一个分布式系统组织成中间件形式,中间件层分布在多台机器上。[attach]821[/attach]分布式系统优点:[attach]822[/attach]分布式操作系统特点:[attach]823[/attach] 网络操作系统(NOS)网络操作系统的一般结构:[attach]824[/attach]分布式系统中设计的关键问题:透明性(对用户、程序)[attach]825[/attach]灵活性[attach]826[/attach]单内核基本上是目前的集中式操作系统,增加了网络功能和远程服务集合。 微内核的四种基本服务: (1)进程间通信机制 (2)少量内存管理功能 (3)必要的低层进程管理和调度 (4)低层输入/输出服务可靠性[attach]827[/attach]性能[attach]828[/attach]可伸缩性(scalability)避免:
- []集中式硬件[/][]集中式算法[/][]集中式的数据结构[/]
- []没有一台机器上存放着关于系统状态的全部信息[/][]机器只是基于本地信息做出决定[/][]一个机器出故障不会破坏算法[/][]不一定存在全局时钟。[/]
总结
没有固定的架构,架构都是随着时间和业务的迁徙和变动而发生改变和重构的。所以架构不是一成不变的,也不是淘宝的架构就是万能的,适应你们业务的架构演变的架构就是最优架构。万变不离其宗,但是其底层技术实现和方法是可以借鉴采用大公司场景做法。