主页

索引

模块索引

搜索页面

架构设计目的

重要

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

备注

架构设计的目标,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行成本来保障软件的运行。架构设计的道,就是组织人员和技术把系统和团队拆分,并安排好切分后的排列关系,让拆分后的部分能通过约定好的协议相互通信,共同实现最终的结果。

复杂度的6个来源:

1. 高性能: High Performance
2. 高可用: High Availability
3. 可扩展性: Extension
4. 低成本: Low Cost
5. 安全: Security
6. 规模: Scalability

简单的复杂度分析案例

备注

通过些实例学会: 如何将 “架构设计的真正目的是为了解决软件系统复杂度带来的问题” 这个指导思想应用到实践中。

假设我们需要设计一个大学的学生管理系统,其基本功能包括登录、注册、成绩管理、课程管理等。当我们对这样一个系统进行架构设计的时候,首先应识别其复杂度到底体现在哪里。

  1. 性能:

    一个学校的学生大约 1 ~ 2 万人,学生管理系统的访问频率并不高,
    平均每天单个学生的访问次数平均不到 1 次,因此性能这部分并不复杂,
    存储用 MySQL 完全能够胜任,缓存都可以不用,
    Web 服务器用 Nginx 绰绰有余。
    
  2. 可扩展性:

    学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂。
    
  3. 高可用:

    学生管理系统即使宕机 2 小时,对学生管理工作影响并不大,因此可以不做负载均衡,更不用考虑异地多活这类复杂的方案了。
    但如果学生的数据丢失,修复是非常麻烦的,只能靠人工逐条修复,这个很难接受,因此需考虑存储高可靠,这里就有点复杂了。
    我们需要考虑多种异常情况:机器故障、机房故障,针对机器故障,我们需要设计 MySQL 同机房主备方案;
    针对机房故障,我们需要设计 MySQL 跨机房同步方案。
    
  4. 安全性:

    学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况,
    但并不是和金融相关的,也不包含强隐私(例如玉照、情感)的信息,
    因此安全性方面只要做 3 个事情就基本满足要求了:
      Nginx 提供 ACL 控制、用户账号密码管理、数据库访问权限控制。
    
  5. 成本:

    由于系统很简单,基本上几台服务器就能够搞定,对于一所大学来说完全不是问题,可以无需太多关注。
    

结论:

这个方案的主要复杂性体现在存储可靠性上,
需要保证异常的时候,不要丢失所有数据即可(丢失几个或者几十个学生的信息问题不大)
https://img.zhaoweiguo.com/knowledge/images/architectures/designs/design_demo_school.jpg

学生管理系统架构图

其他

架构设计中最为重要的是考虑各种非功能性需求,同样的功能但不同的非功能性需求设计方案会有很大的不同,比如登陆系统,功能都是相同,但一个要求是 100/s,另一个是 10w/s,,这两个架构是完全不一样。在实际情况下在安全性上的考虑会弱些,需要借助于专门的安全团队去进行评估和提供建议,架构师更多的精力在性能、容量、高可用、扩展性等方面。通俗的说法是功能需求和质量需求。

集群的方式部署呢?有没有一个评估的方法论:

对单机进行性能测试,获得单机性能的极限数据,当业务实际性能达到极限的 80% 时,开始考虑扩容

主页

索引

模块索引

搜索页面