架构设计目的 ############ .. important:: 架构设计的主要目的是为了解决软件系统复杂度带来的问题。 .. note:: 架构设计的目标,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行成本来保障软件的运行。架构设计的道,就是组织人员和技术把系统和团队拆分,并安排好切分后的排列关系,让拆分后的部分能通过约定好的协议相互通信,共同实现最终的结果。 复杂度的6个来源:: 1. 高性能: High Performance 2. 高可用: High Availability 3. 可扩展性: Extension 4. 低成本: Low Cost 5. 安全: Security 6. 规模: Scalability .. toctree:: :maxdepth: 1 purposes/1performance purposes/2availability purposes/3expandability purposes/4lowcost purposes/5security purposes/6scalability purposes/7other 简单的复杂度分析案例 ==================== .. note:: 通过些实例学会: 如何将 “架构设计的真正目的是为了解决软件系统复杂度带来的问题” 这个指导思想应用到实践中。 假设我们需要设计一个大学的学生管理系统,其基本功能包括登录、注册、成绩管理、课程管理等。当我们对这样一个系统进行架构设计的时候,首先应识别其复杂度到底体现在哪里。 1. 性能:: 一个学校的学生大约 1 ~ 2 万人,学生管理系统的访问频率并不高, 平均每天单个学生的访问次数平均不到 1 次,因此性能这部分并不复杂, 存储用 MySQL 完全能够胜任,缓存都可以不用, Web 服务器用 Nginx 绰绰有余。 2. 可扩展性:: 学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂。 3. 高可用:: 学生管理系统即使宕机 2 小时,对学生管理工作影响并不大,因此可以不做负载均衡,更不用考虑异地多活这类复杂的方案了。 但如果学生的数据丢失,修复是非常麻烦的,只能靠人工逐条修复,这个很难接受,因此需考虑存储高可靠,这里就有点复杂了。 我们需要考虑多种异常情况:机器故障、机房故障,针对机器故障,我们需要设计 MySQL 同机房主备方案; 针对机房故障,我们需要设计 MySQL 跨机房同步方案。 4. 安全性:: 学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况, 但并不是和金融相关的,也不包含强隐私(例如玉照、情感)的信息, 因此安全性方面只要做 3 个事情就基本满足要求了: Nginx 提供 ACL 控制、用户账号密码管理、数据库访问权限控制。 5. 成本:: 由于系统很简单,基本上几台服务器就能够搞定,对于一所大学来说完全不是问题,可以无需太多关注。 结论:: 这个方案的主要复杂性体现在存储可靠性上, 需要保证异常的时候,不要丢失所有数据即可(丢失几个或者几十个学生的信息问题不大) .. figure:: https://img.zhaoweiguo.com/knowledge/images/architectures/designs/design_demo_school.jpg 学生管理系统架构图 其他 ==== 架构设计中最为重要的是考虑各种非功能性需求,同样的功能但不同的非功能性需求设计方案会有很大的不同,比如登陆系统,功能都是相同,但一个要求是 100/s,另一个是 10w/s,,这两个架构是完全不一样。在实际情况下在安全性上的考虑会弱些,需要借助于专门的安全团队去进行评估和提供建议,架构师更多的精力在性能、容量、高可用、扩展性等方面。通俗的说法是功能需求和质量需求。 集群的方式部署呢?有没有一个评估的方法论:: 对单机进行性能测试,获得单机性能的极限数据,当业务实际性能达到极限的 80% 时,开始考虑扩容