架构设计的目的
为了解决软件系统复杂度带来的问题。

复杂度的来源:
一:高性能
1.单机复杂度
需要考虑多进程、多线程、进程间通信、多线程并发等技术
2.集群的复杂度
(1)任务分配:比如Nginx负载均衡。Nginx也可以是集群。
(2)任务分解:业务本身越来越复杂,需要进行任务分解。

二:高可用
1.计算高可用
2.存储高可用

三:高扩展性
1.正确预测变化
2.完美封装变化

四:低成本

五:安全
1.功能安全
2.架构安全
互联网系统的架构安全目前并没有太好的设计手段来实现,更多地是依靠运营商或者云服务商强大的带宽和流量清洗的能力,较少自己来设计和实现。

六:规模
规模带来复杂度的主要原因就是“量变引起质变”,比如功能、数据,当数量超过一定的阈值后,复杂度会发生质的变化。

架构设计的三个原则
第一:合适,优于业界领先

第二:简单,优于复杂

第三:演化,优于一步到位

架构设计流程
第一:识别复杂度
架构设计的本质目的是为了解决软件系统的复杂性,所以在设计架构时,首先就要分析系统的复杂性。只有正确分析出了系统的复杂性,后续的架构设计方案才不会偏离方向。将主要的复杂度问题列出来,然后根据业务、技术、团队等综合情况进行排序,优先解决当前面临的最主要的复杂度问题。

第二:设计备选方案
第三:评估和选择备选方案
列出我们需要关注的质量属性点,然后分别从这些质量属性的维度去评估每个方案,再综合挑选适合当时情况的最优方案。
第四:详细方案设计

高性能数据库集群:读写分离
读写分离的基本实现是:
数据库服务器搭建主从集群,一主一从、一主多从都可以。
数据库主机负责读写操作,从机只负责读操作。
数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。
业务服务器将写操作发给数据库主机,将读操作发给数据库从机。

有两个细节点将引入设计复杂度:主从复制延迟和分配机制。

主从复制延迟:
解决主从复制延迟有几种常见的方法:

  1. 写操作后的读操作指定发给数据库主服务器
  2. 读从机失败后再读一次主机
  3. 关键业务读写操作全部指向主机,非关键业务采用读写分离

分配机制:
将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式:程序代码封装和中间件封装。