威龙发艺发型设计价格联盟

结构化思维下,架构设计中的10个宏观过程

软件工程之思2018-06-25 18:51:52

架构设计所提出的问题就是:当我们面对一个实际系统设计问题时,我们会以什么样的脉络进行?在软件设计中,宏观上看自上而下大致上可以分成三个大的过程域,它们的关系如下:

要注意这三者之间的关系是反馈螺旋上升的,而不是简单线性前馈的。

顶层架构设计过程域的目标是:建立一个系统的概念性架构,为系统描绘一个初始的轮廓,并且对涉及全局的问题进行决策。

领域对象设计过程域的目标是:根据细化的领域对象模型,在细节层面对每一个领域对象进行刻画,并且对于这些细节层面的技术问题进行决策。

资源应用设计过程域的目标是:在宏观和微观两个层面,对于涉及内存、对象、数据等方面的方案和问题进行决策。

这三过程域每一个都是一个大的范围,解决一组大的问题。为了进一步的细化,在每个过程域内部,又可以包括一系列的过程,用于解决一个特定的主题和问题。

顶层架构设计过程域

顶层架构设计过程域内部可以包含4个过程,它们需要解决的问题如下所示。

过程1:从混沌到结构

任何设计之初,都会面临一个相对抽象的需求,我们如何从需求和限制的混沌中理清思路,得到一个粗粒度的软件结构,进而产生清晰而独立的实体部件,以构成整个要开发的软件系统?

此外,在过程中还需要从操作质量(性能、可用性)到开发质量(可扩展性、可维护性)形成可持续软件架构的一些关键概念和思考方法,所必须考虑的问题包括:


  • 如何建立领域结构和工作流的精确模型?

  • 如何建立子系统级属性划分应用职责的通用办法?

  • 如何建立支持表现层变化的结构?

  • 如何建立通过交换数据流来通信的结构?

过程2:分布式基础设施

对于任何一个基于网络的系统,在已经得到粗粒度的软件结构的基础上,都需要关注分布式系统的基础设施的问题,特别是功能组件如何在网络环境中正确分布?如何正确布局中间件及其相关问题?中间件是分布式软件的基础设施,它可以帮助我们简化分布式系统中的应用开发。这个模式可以帮助开发人员理解常用中间件产品和平台所支持的基础通信范式,以及其软件架构的关键方面。所必须考虑的问题包括:


  • 基于消息传递方式的基本方式是什么?

  • 实现消息通信机制更好的方式是什么?

  • 如何隐藏网络的存在以及远程方法调用的通信?

过程3:事件分离和分发

在正确布局分布式基础设施的基础上,就要考虑如何进行通信。不管应用多么复杂的通信模型(同步请求/响应、异步消息、发布/订阅),分布式系统的核心就是处理和响应网络中的消息。事件驱动的内核扮演着至关重要的角色,他决不能成为系统性能的瓶颈。

所必须考虑的问题包括:


  • 如何检测、分离、分发和处理从网络上接收到的事件?

  • 如何建立进一步细化的对引入事件进行处理的结构?

过程4:接口划分

在定义清楚通信方式以后,作为架构设计的重点问题,就需要考虑各个分布式领域对象交互的规约。也就是接口划分问题。接口是领域对象的“名片”,客户端可以通过它来了解领域对象的功能和协议。接口应该方便客户端和领域对象之间进行正确而有效的协作。因此,设定可用性强、有价值的领域对象接口,对软件开发成功至关重要。要做到这一点必须关注两个问题:第一是接口必须能清楚反映领域对象的职责,并且对客户端是有意义的;第二,当领域对象的实现发生变化和改进的时候,不应该影响到客户端。

所必须考虑的问题包括:


  • 如何定义一个接口?

  • 如何建立支持角色专属的接口结构?

  • 如何建立特殊要求要求的接口结构?

  • 如何建立屏蔽某些特殊变化的接口结构?

  • 如何建立对于并发性和分布式有特殊要求的接口结构?

经过上述四个方面问题的考虑,一个初始的顶层架构就被设计出来了。顶层架构框定了产品的轮廓,做出了对于产品来说最重要的一些决策,并形成了产品的主要特征,这对于产品的成功及其重要。


领域对象设计过程域

在完成了顶层架构之后,就需要对产品进行更细腻的考虑,这就是领域对象设计过程域。这个过程域内部包括5 个过程,他们需要解决的问题如下图所示。


过程5:对象划分

有了经过深思熟虑的稳定的接口之后,就需要考虑每个领域对象的结构设计。领域对象是基本的实现单元,它为客户端提供定义清晰的服务。尽管客户端并不十分关心领域对象的内部设计,但是领域对象的划分会严重影响到对外部可见的质量特征,如性能、可伸缩性、灵活性、可用性以及容错性。

所必须考虑的问题包括:


  • 如何建立高质量的领域对象划分和实现的结构?

  • 如何建立在领域对象分布式部署时保证性能和可用性的结构? 

过程6:并发

分布式系统通常都是并发进行的,特别是那些需要同时处理多个客户请求的服务器端应用,都可以从并发中获益。另外,多核CPU 和多CPU 的广泛应用,使分布式系统开发人员必须精通进程和线程管理机制。没有一种软件架构可以适用于所有平台和各种负荷情况。

所必须考虑的问题包括:


  • 如何建立以更少的资源支持并发的结构?

  • 如何建立能良好处理访问同步的并发结构?

过程7:同步

定义并发就一定会遇到同步问题。同步访问共享组件、对象和资源,并避免死锁、竞争和其它并发问题是构建分布式系统最为困难的任务之一。此外,同步会带来很大的系统开销,所以设计应用程序的时候应该减少或避免不必要的同步。

所必须考虑的问题包括:


  • 如何建立并发访问某个数据的时候,对这些线程进行协调的结构?

  • 如何建立解决不同问题的串行化技术结构?

  • 如何建立解决避免加锁开销的结构?

过程8:对象交互

在解决了上述问题的基础之上,就需要细致考虑对象间如何进行交互的问题。在独立程序中,对象间的协作主要包括互相调用方法和服务、传递调用参数、同步等待被调用参数返回结果。然而,为了平衡各种相互冲突的驱动因素(如:延时、可伸缩性、可靠性),分布式系统的交互要复杂的多,需要考虑和平衡更多的问题。

所必须考虑的问题包括:


  • 如何协调和安排应用领域对象和对象之间的互操作的结构?

  • 如何处理在对象交互中有特殊要求的结构?

过程9:适配与扩展

软件中唯一不变的东西就是变化,特别是如果希望构建产品线架构和共享框架,就一定要仔细设计和考虑适配和扩展的问题。不论是面对单一用户还是大众市场的产品,都能从公共框架的基础上获益。这种方式可以简化重复业务,对新的相似功能能简化定制工作,多个用户也能从某个特定软件基础设施上受益。一个预期长期存在的分布式系统,就应该是可配制的、自适应的和可以改进的,否则产品将难以适应未来生态环境的变化。

所必须考虑的问题包括:


  • 如何建立将接口和实现进行解耦合的结构?

  • 如何建立对领域对象实现进行功能扩展的结构?

  • 如何建立为领域对象提供可变的算法和行为的结构?

  • 如何建立需要安装插件的宿主基础设施的结构?

资源应用设计过程域

有了合理布局和正确的领域对象设计,我们就要为产品在分布式系统中的资源应用多做些考虑了。如何合理配置资源?如何在尽可能少的资源消耗下,给产品提供尽可能高的性能空间?这些问题必须得到解决。资源应用过程域包括两个过程,他们需要解决的问题如下图所示。


过程10:资源管理

资源管理对于分布式系统至关重要,例如,在内存中保持太多无用对象会导致服务器性能下降。许多应用服务质量特性,如性能、可伸缩性、灵活性、稳定性、可靠性、可移植性、安全性等,都依赖于有效创建、获取、访问、使用、销毁、释放资源,以及整体上合理管理资源。满足了某种需求经常会和另一种需求相冲突,这种资源平衡折中方案,会使资源管理更加困难。

所必须考虑的问题包括:


  • 如何建立整个资源管理框架的结构?

  • 如何建立针对有效资源管理不同实现方面的结构?

  • 如何建立针对多个客户共享的对象和资源释放策略的结构?

  • 如何建立针对对象创建和析构的不同方面的结构?

过程11:数据库访问

大部分分布式系统都是用数据库存储持久化数据,目前常用的数据库大多是关系型的,但如何把面向对象的应用灵活有效的映射到关系型数据库架构上,往往比想象的要困难得多,并且经常会超过以往的挑战。

所必须考虑的问题包括:


  • 如何建立一个数据库访问层?

  • 不同数据库访问层,需要什么具体实现方式?

除了第一个过程(从混沌到结构)以外,设计过程中其它过程的出现都不是线性的,在整个设计过程中没有明显的先后秩序,而是互相支持、互相补充、逐步完善。产品设计本质上就是一次又一次的重构过程,所以架构师要善于发现“坏味”,并针对这些“坏味”来思考和完善。

过程描述了设计所必须达到的目标,以及用什么样的步骤才能达到这个目标。过程让我们的思维有条理,并保证组织能有一致的方法处理问题,避免思维缺失和漏洞。


转自:中科院计算所培训

友情链接