软件架构定义:“有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计”。系统的各个重要组成部分及其关系构成了系统的架构,这些组成部分可以是具体的功能模块,也可以是非功能的设计与决策,他们相互关联组成一个整体,共同构成了软件系统的架构。
一般来说,除了当前的系统功能需求外,软件架构还需要关注性能、可用性、伸缩性、扩展性和安全性这5个架构要素。
1.性能
(1)在浏览器端,可以通过浏览器缓存、使用页面压缩、合理布局页面、减少Cookie传输等手段改善性能;使用CDN,将网页静态内容分发至离用户最近的网络服务商机房,使用户通过最短访问路径获取数据;在网站机房部署反向代理服务器,缓存热点文件,加快请求相应速度,减轻应用服务器负载压力。
(2)在应用服务器端,使用服务器本地缓存和分布式缓存,通过缓存在内存中的热点数据处理用户请求,加快情况处理过程,减轻数据负载压力;通过异步操作将用户请求发送至消息队列等待后续任务,而当前请求直接返回相应给用户。
(3)在多用户高并发请求下,可以将多态应用服务器组成一个集群共同对外服务,提高整体处理性能,改善性能。
(4)在代码层面,通过使用多线程、改善内存管理等手段优化性能。
(5)在数据库服务器端、索引、缓存、SQL优化等性能优化手段都已经比较成熟。亦可以使用NoSql数据库通过优化数据模型、存储结构、伸缩特性等手段今夕优化。
衡量网站性能有一系列指标,重要的有响应时间、TPS、系统性能计数器等,通过测试这些指标以确定系统设计是否达标。
2.可用性
高可用设计的目标就是当服务器宕机时,服务或者应用依然可用。
网站高可用的主要手段是冗余,应用部署在多台服务器上同时提供访问,数据存储在多台服务器上互相备份,任何一台服务器宕机都不会影响应用的整体可用,也不会导致数据丢失。
(1)对于应用服务器,多台应用服务器通过负载均衡设备组成一个集群共同对外提供服务,任何一台服务器宕机,只需要请求切换到其他服务器就可实现应用的高可用。
(2)对于存储服务器,由于其上存储着数据,需要对数据进行实时备份,当服务器宕机时需要将数据访问转移到可用的服务器上,并进行数据恢复以保证继续有服务器宕机的时候数据依然可用。
(3)此外,还需要软件开发过程的质量保证。通过预发布验证、自动化测试、自动化发布、灰度发布等手段,减少将故障引入线上环境的可能,避免故障范围扩大。
3.伸缩性
伸缩性:通过不断向集群中加入服务器的手段来换届不断上升的用户并发访问压力和不断增长的数据存储需求。
(1)对于应用服务器集群,只要服务器上不保存数据,所有服务器都是对等的,通过使用合适的负载均衡设备就可以向集群中不断加入服务器。
(2)对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,进而导致集群中大部分缓存数据都无法访问。虽然缓存的数据都可以通过数据库重新加载,但是如果应用已经严重依赖缓存,可能会导致整个网站崩溃。需要改进缓存路由算法保证缓存数据的可访问性。
(3)关系数据库虽然支持数据复制,主从热备等机制,但很难做到大规模集群的可伸缩行,因此关系数据库的集群伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群。
(4)对于大部分的NoSql数据库产品,由于其先天就是为海量数据而生,因此其对伸缩性的支持通过都非常好,可以做到在较少运维参与的情况下实现集群规模的线性伸缩。
4.扩展性
网站可扩展架构的主要手段是事件驱动架构和分布式服务。
(1)事件驱动架构在网站通常利用消息队列实现,将用户请求和其他业务时间构造成消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。通过这种方式将消息产生和消息处理分离开来,可以透明地增加新的消息生产者任务或者新的消息消费者任务。
(2)分布式服务则是将业务和可复用服务分离开来,通过分布式服务框架调用。新增产品可以通过调用可复用的服务实现自身的业务逻辑,而对校友产品没有任何影响。可复用服务升级变更的时候,也可以提供给提供多版本服务对应实现透明升级,不需要牵制应用同步变更。
5.安全性
互联网是开放的,任何人任何地点都可以访问网站。网站的安全架构就是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。
衡量网站安全架构的标准就是针对现存和潜在的各种攻击与窃密手段,是否有可靠的应对策略。