定义:有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

一般来说,除了系统功能需求方面外,软件架构还应该关注以下要素:

  • 性能
  • 可靠性
  • 伸缩性
  • 扩展性
  • 安全性

一、性能

重要指标!
优化手段:

  • 浏览器端:浏览器缓存、页面压缩、合理布局页面、减少cookie传输。。。
  • 使用CDN:静态内容分发至服务商机房。。。
  • 反向代理服务器:缓存热点文件。。。
  • 应用服务器端:服务器本地缓存、分布式缓存。。。加速请求处理过程、减少数据库压力
  • 使用异步操作:消息队列任务后台持续处理。。。
  • 组件集群:对外提供高并发高用户情况。。。
  • 代码层面:多线程技术、内存管理机制。。。
  • 数据库端:索引、缓存、SQL优化、NoSQL。。。

衡量指标:

  • 响应时间
  • TPS
  • 系统性能计数器

二、可靠性

主要手段:冗余
应用部署在多台服务器上同时提供访问,数据存储在多台服务器上互相备份,任何一台故障不影响整体使用,不会导致数据丢失。

无故障时间,大型网站可用性超过99.99%。

大量服务器情况下,部分服务器宕机必然会出现。

高可用设计目标:当发生宕机的情况,服务或应用依然可用。

1、应用服务器

  • 多台服务器通过负载均衡组成一个集群对外提供服务。
  • 一台服务器故障,切换到其它服务器即可。
  • 应用服务器上面不能保存请求的会话信息。(故障转发无法完成业务)

2、存储服务器

  • 需要对数据进行实时备份。
  • 故障则转移到其它可用服务器。

3、其他方面软件质量控制

  • 预发布验证
  • 自动化测试
  • 自动化发布
  • 灰度发布

减少故障引入生产环境的可能性,避免故障范围扩大。
可以使用假设分析法进行分析。

三、伸缩性

指通过不断向集群添加新的服务器端手段来缓解不断上升的用户并发访问压力和不断增长点数据存储需求。

主要指标:

  • 是否可以用多台服务器构建集群
  • 是否容易向集群添加新的服务器
  • 加入新服务器后,是否可以提供和原来无差别的服务
  • 集群可容纳的总服务器是否有限制

1、应用服务器集群

  • 服务器上面不保存数据,则全部服务器对等。
  • 通过负载均衡设备就可向集群增加服务器。

2、缓存服务器

  • 加入新的服务器可能导致原缓存路由失效,导致集群大部分缓存数据无法访问。
  • 虽缓存可以重新加载,但如应用重度依赖缓存,可能导致整体崩溃。
  • 需要改进缓存路由算法。

3、数据库

  • 关系型数据支持数据复制,主从热备机制,很难做到大规模集群的可伸缩性。
  • 关系型数据的集群伸缩性方案必须在数据库之外实现,通过路游分区等手段,将多个数据库服务器组成一个整体。
  • NoSQl产品,通常伸缩性较好。

四、扩展性

管制功能需求

快速响应变化

衡量扩展性:

  • 增加新的业务产品,是否可以实现对现有产品透明无影响,不需要改动或者很少改动既有业务功能就可以上线。
  • 不同产品之间是否很少耦合,一个产品修改对其它无影响。

主要手段:
1、事件驱动架构

  • 通常利用消息队列实现,将消息的产生、消息的处理分离。
  • 可以透明增加新的消息生产者或者消息消费者。

2、分布式服务

  • 将业务和可复用服务分离开,通过分布式服务框架调用。
  • 新增产品可以通过调用可复用的服务实现实现自身的业务逻辑,而对现有产品没有影响。
  • 可复用服务升级变更时,可以通过提供多版本服务对应用实现透明升级,不强制同步变更。

五、安全性

互联网的开放性

保护网站不受恶意访问、攻击,保护重要数据不被窃取。

衡量手段:针对现存和潜在的各种攻击、窃取手段,提供可靠的应对策略。