首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >系统软件架构重塑(上) ——以“一致性与并发”即以正确性和性能为出发点重构并发系统软件

系统软件架构重塑(上) ——以“一致性与并发”即以正确性和性能为出发点重构并发系统软件

原创
作者头像
那海蓝蓝
修改2024-12-24 20:25:46
修改2024-12-24 20:25:46
4800
举报
代码语言:txt
复制
提纲:
    引文
    一 系统软件的初级阶段
    二 (系统)软件的量化阶段
    三 并发类系统软件的目标原则
    四 并发类系统软件的核心问题和本质
    五 “正确性与性能”即一致性与并发,可重塑系统软件架构
    六 结语

引文:

我在思考一个问题:

设计一个系统软件,其架构设计,应该遵循什么样的原则?

通常,我们会认为,架构设计原则大致如下:

1. 模块化:将系统划分为独立的功能模块,每个模块负责特定的任务,降低耦合度,提高代码复用率。

2. 分层结构:采用分层架构,将逻辑分离为表示层、业务逻辑层和数据访问层,使各层职责清晰,易于理解和维护。

3. 松散耦合:确保各个组件之间尽可能少地直接依赖,利用抽象接口或事件驱动的方式进行交互。

4. 高内聚:每个模块或组件应当专注于单一职责,内部元素紧密协作,减少不必要的复杂性。

5. 无状态设计:在可能的情况下,尽量设计成无状态的服务,这样可以更容易地实现水平扩展,并减少会话管理带来的负担。

6. 幂等性:对于重复的操作,确保结果一致,即使操作被多次执行也不会产生副作用。

7. 最小惊讶原则:设计应直观且符合直觉,避免出乎意料的行为,让开发者和用户都能快速理解并正确使用。

8. 持续改进:架构不是一成不变的,应该预留一定的灵活性以应对未来的需求变化和技术进步。

9. 性能优先:在不影响可靠性和安全性的前提下,始终关注性能优化,从算法选择到硬件资源利用都要精益求精。

10. 开放闭合原则:对扩展开放,对修改封闭,即系统能够方便地添加新功能,而不需要改动已有代码。

如果答案是如上类似的样子,很显然,其中一些原则是在规避系统的复杂性试图以简代繁,因此总是有“小心翼翼地摸着石头过河”的模样。

因此,我在想:为什么需要“持续改进?”——如果一个事情的来龙去脉内在机理外在功能我们都已经全部掌握(形神兼备内外兼通),那么我们是否就可以设计出一个 “能长期稳定运行”的软件系统?事实上,软件技术已经发展了70+年了,人类尚没有能掌握软件技术的全部内容(或甚至是只知皮毛?),没有总结出软件技术的要点,所以也只能迭代式地构建软件系统(当然也因需应对不断变化的新需求而不断迭代的应用类软件则需要小步快跑)。迭代虽然是应对未知世界的法宝,但也在彰显我们“已知”部分的渺小。

如果不是所有的软件都能有稳定的需求,我们退而求其次:对于较为成熟稳定的系统软件,如操作系统、数据库、分布式文件系统、中间件等,这些系统是否能被重构,是否有希望能做好顶层设计,使得我们能一次性地构建起一个“能长期稳定运行”的系统软件?

一、系统软件的初级阶段

人类在研发软件技术方面,成绩巨大,这70+年来,我们从早期阶段(20世纪50年代-60年代)的机器语言与汇编语言起步,到结构化编程与操作系统兴起(20世纪60年代末-70年代),再到面向对象编程及互联网崛起(20世纪80年代-90年代)、组件化、分布式计算与Web应用(20世纪90年代末-21世纪初)、以及移动计算与大数据时代(21世纪初至今),经历了这些阶段,人类实现了:编程语言多样化:从最初的机器码(面向机器的原始阶段)到如今种类繁多的高级语言,每种语言都有其特定用途和技术优势;软件工程方法论成熟:结构化、面向对象、敏捷开发等多种方法论不断演进(面向程序员的初级阶段),提升了软件项目的成功率;中间件与服务导向架构(SOA):这些技术增强了系统的灵活性和互操作性,便于构建复杂的分布式系统(面向用户的应用发展阶段);安全性和隐私保护增强:面对日益增长的安全威胁,加密技术和隐私政策不断完善,保障了用户数据的安全;开源运动蓬勃发展:Linux、Apache、Mozilla Firefox、PostgreSQL等项目证明了社区合作的力量,促进了技术创新和技术共享。

软件技术的发展不仅改变了信息技术本身,也深刻影响了社会各个层面的生活方式和工作模式。未来,随着量子计算、边缘计算等新兴领域的探索,软件技术将继续保持快速发展的态势。

但是,软件技术蓬勃发展的同时,也显然表明,软件技术的发展,尚处于一个初级阶段

  1. 在这样的阶段,我们对软件系统的认知尚处于积累阶段,因此持续改进、开放闭合等成为设计原则。
  2. 在这样的阶段,我们不能摸清系统的复杂度,因此需要模块化技术和分层结构,来弱化软件系统的复杂难度,但模块或层次之间的边界却难以清晰划分(一个生物系统逻辑分离的模块之间逻辑界限清晰但物理层面却有着复杂、丰富的毛细系统做边界)、或者边界不够丰富难以完全正确勾勒出真正的界限。
  3. 在这样的阶段,高内聚和低耦合使得我们关注主要矛盾并进一步降低关联以降低复杂度,但我们也不能知晓这样或那样的分析、划分方式是不是如盲人摸象。一个明显的例子是,如数据库系统处理并发时,会有多种并发算法,这些算法都在解决并发问题,但算法之间的关联关系是什么我们却不清晰!算法似乎都有着不相同的子问题,但解决了这些不同的子问题却达到了让系统实现正确并发的初始目的。这种现象就是典型的盲人只摸到大象耳朵或尾巴等做出不同结论的样子。其实,如这样并发的例子,不只是数据库系统中存在,在操作系统、分布式系统等同样存在。

在这样的系统软件的初级阶段,我们是不是可清醒地认知到,我们对系统类软件的顶层设计方法,还知之甚少?如果答案显而易见确实是知之甚少,那么我们是不是还可以问自己一些基本的问题:

  1. 多种系统软件之间,有无共性?例如操作系统、数据库、分布式系统、文件系统等之间的共性在哪里?
  2. 如果有共性,为什么会有那些共性?这其中是否存在本质上的关联?
  3. 如果有共性,其间还存在这本质上的关联,那么其本质又是什么?

如果我们能探知如上问题,则有望开辟系统软件的新面貌,系统软件的设计原则和架构,也许会有翻天覆地的变化。如果走到那一天,则人类跨过了系统软件的初级阶段,会进入一个新的阶段?

那样的一个新的阶段,会是什么样子呢?是什么因素能推动(系统)软件进入一个新阶段呢?

二 (系统)软件的量化阶段

认知事务的过程是一个复杂且多层次的活动,涉及感知、理解、分析和综合等多个步骤。虽然不同的理论和学科可能对这一过程有不同的描述,但可以概括为几个关键阶段。例如,认知过程主要包括:

  1. 感知(Perception):接触新信息的第一步,通过感官接收外部世界的信号,形成初步的印象或意识,为后续处理提供基础材料。
  2. 注意(Attention):从众多感知到的信息中选择关注的对象,集中精力于特定的事物或现象,过滤掉无关紧要的信息。
  3. 初步认知(Initial Recognition):基于已有的知识结构对事物做出最初的理解或识别,建立起与已有经验的联系,为进一步深入研究打下基础。
  4. 量化认知(Quantitative Understanding):引入定量分析的方法,如测量、统计等,以更精确地描述对象的属性,这可以使认知更加具体化,便于比较和验证假设。

再往后,还可以包括深度理解(Deep Comprehension)、完全认知(Complete Cognition)、规律化总结(Pattern Recognition and Generalization)、应用与实践(Application and Practice)、反思与修正(Reflection and Adjustment)等,我们不再一一指出。

重要的是,我们对系统软件的研发,还没有进入到量化阶段。由此,人类已经积累的软件知识和经验,依然在初级阶段。

那么,对系统软件的研发怎么才能步入到量化阶段?

这显然是一个开放的问题,也是一个需要我们摸索的问题。

现在,我们再来问自己几个问题:

  1. 有关认知方法:现有的一些量化方法,是否有助于引领系统软件步入量化阶段?例如定义明确的度量指标、实施自动化工具和支持、建立数据收集机制、数据分析与可视化等,是一些有作用的技术手段,但是,他们能否跨越操作系统、数据库、分布式系统等之间的鸿沟,找出共性的东西来量化我们对于系统软件的认知呢?
  2. 独立系统的量化认知:操作系统、数据库、分布式系统等每一个系统,是否已经能量化认知了?显然没有。但是,为什么单独的系统尚不能被量化认知呢?
  3. 跨越系统的量化认知:操作系统、数据库、分布式系统等都具备并发处理需求的系统,是否能被从同样的角度出发而建立统一的量化认知体系?
  4. 基于本质的量化:操作系统、数据库、分布式系统等共同的本质是什么?如果能探知其本质,是否能基于其共同的本质而统一量化并发类的·系统软件?

我们处于一个幸运的时代,我们遇上了软件技术蓬勃发展的阶段,更遇上了各种软件百花齐放的时代,这使得我们的思路得以打开,有机会能跨越(并发类)系统软件而研究其共同本质。我认为,基于他们共同的本质而建立量化体系,是一条可以建立完备的量化系统的好方法。

而想要建立量化体系,首先需要明确目标。

并发类系统软件的目标原则

前述,我们谈到软件系统架构设计原则,那些原则是经验积累而成的,并没有科学的方法论始终贯穿在软件系统架构设计的过程中,因此所积累出的设计原则角度丰富多彩、似乎很有道理而侧重体感,但缺乏系统化、形式化的体系或方法贯穿其中。

因此,我们进一步下沉问题到并发类的系统软件,避免问题太高而过于抽象、以致不能落地。

我们聚焦于讨论:并发类系统软件的目标原则。

首先,我们看什么是并发类软件系统的目标。

有人认为:并发类软件系统的设计目标是为了确保系统能够在多任务环境中高效、可靠地运行,同时满足性能、响应性和资源利用等方面的要求。他们认为并发类软件系统设计时需要考虑的主要目标,可能会包括:

1. 高效性(Efficiency)

  • 资源最大化利用:通过合理的线程管理和调度策略,确保CPU、内存等硬件资源得到充分利用,减少闲置时间。
  • 最小化开销:降低上下文切换、锁竞争等带来的额外开销,提高系统的整体吞吐量。

2. 响应性(Responsiveness)

  • 快速响应用户请求:即使在高负载情况下也能及时处理用户输入或外部事件,提供良好的用户体验。
  • 低延迟操作:对于实时性要求高的应用(如金融服务、在线游戏),保证关键任务能在规定时间内完成。

3. 可扩展性(Scalability)

  • 水平扩展:支持添加更多节点来分担工作负载,随着用户数量的增长而线性提升性能。
  • 垂直扩展:允许增强单个服务器的硬件配置以适应更高的性能需求。

4. 可靠性(Reliability)

  • 容错能力:设计具有自我修复机制的系统,在遇到故障时能够自动恢复服务,不影响用户体验。
  • 数据一致性:在分布式环境中保持数据的一致性和完整性,避免因并发访问导致的数据冲突或丢失。

5. 安全性(Security)

  • 访问控制:实施严格的权限管理,防止未授权访问敏感信息或执行危险操作。
  • 加密通信:在网络传输中采用安全协议(如TLS/SSL)保护数据隐私。

6. 易维护性(Maintainability)

  • 模块化设计:将系统划分为独立的功能模块,简化代码理解和修改,便于团队协作开发。
  • 日志记录与监控:建立完善的日志系统和实时监控机制,帮助快速定位问题并进行调试。

7. 兼容性(Compatibility)

  • 跨平台支持:确保软件可以在不同的操作系统和硬件架构上顺利运行。
  • 向前向后兼容:新版本应尽量保持对旧版本API的兼容性,减少升级带来的影响。

8. 灵活性(Flexibility)

  • 动态调整:根据实际运行状况灵活调整参数设置,如线程池大小、缓存策略等,以优化性能表现。
  • 插件式架构:允许第三方开发者扩展功能,而不必改动核心代码。

9. 公平性(Fairness)

  • 优先级调度:为不同类型的请求分配适当的优先级,确保重要任务不会被长时间阻塞。
  • 负载均衡:合理分配任务到各个处理单元,避免某些部分过载而其他部分空闲。

10. 透明性(Transparency)

  • 抽象层次:隐藏底层复杂性,为用户提供简单易用的接口,使他们不必关心内部实现细节。
  • 隔离性:每个并发任务在其自己的上下文中执行,互不干扰,提高了系统的稳定性和安全性。

是的,这些目标都有用,我们不去质疑。但是,这些目标的来源是来自哪里?为什么是这些而不是还有其他更多的内容?这些目标似乎还是基于经验而没有一套方法论对其进行理论支持。在没有方法论的背景下,也许是没有从并发类系统软件的角度跨系统地统一思考:该类软件需要解决的核心问题是什么?该类软件的核心本质是什么?下篇为您分析

系统软件架构重塑(下)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引文:
  • 一、系统软件的初级阶段
  • 二 (系统)软件的量化阶段
  • 三、并发类系统软件的目标原则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档