架构之道:独立并行处理与松散耦合模式

358 阅读8分钟

Pipes and Filters架构是软件设计中的一种常见架构模式,广泛应用于编译器、Unix Shell以及流数据处理等领域。

我们先来想象数据在Pipe中流动,就像水流一样。在数据流动的过程中(如图5-20所示),它会依次经过各个Filter或处理环节。每个Filter都会对数据进行特定的处理或变换,然后再将处理后的数据送往下一个环节。这样,每个组件都能独立工作,专注于执行其特定的操作,彼此之间不会相互依赖。

图5-20

1、Pipe-Filter模式的定义

Pipe-Filter模式是一种软件架构模式,它由称为Filter的独立组件构成。这些Filter负责接收输入数据、进行转换处理,并将处理后的数据输出。同时,架构中还包括作为数据流连接器的Pipe,每个Pipe都负责将一个Filter的输出连接到下一个Filter的输入。

在很多系统中,需要将一系列离散的数据项从输入转换到输出。在实际应用中,许多种类的数据转换需要反复进行,因此将这些转换过程设计成独立且可重复使用的组件,即Filter,是一个有效的做法。(根据Len Bass,2012年的观点)—《软件构架实践

2、Pipe-Filter模式的描述

在讨论Pipe-Filter模式时,我们强调的是数据流连续转换的关键特性,这是其交互模式的核心。这个过程(如图5-21所示)可以用数据在单向通道中流动的图像来形象地描述。首先,数据从初始源点出发,流向第一个过滤器(Filter)的输入端。在这里,数据会经过特定的处理流程,然后从输出端输出,并沿着管道移动到下一个过滤器。这个过程不断重复,直至数据顺利达到最终的目标数据效果。

图5-21

3、Pipe-Filter模式的优缺点

在讨论过滤器(Filter)的工作机制时,我们可以理解为它能够从一个或多个端口接收数据,同时也能向这些端口输出数据。过滤器能够并行运行,且彼此独立,不互相依赖。重要的一点是,一个Filter的输出往往是另一个Filter的输入,因此它们之间的顺序关系至关重要。至于管道(Pipe),则具有单一的输入和输出端,它保持数据顺序的同时,不对经过的数据进行任何更改。

选择Pipe-Filter架构的优点主要包括:

  • 确保组件和Filter之间的松散、灵活耦合。
  • 这种松散耦合设计使得可以单独更改某个Filter,而不必修改其他Filter。
  • 有利于数据的并行处理。
  • 将Filter视为黑盒,这意味着系统用户无需了解每个Filter内部的工作原理。
  • 高度的可重用性,每个Filter都可以被多次调用和使用。

但这种架构也存在一些局限性,例如:

  • 如果添加了过多独立运行的Filter,可能会因计算开销过大而影响整体性能。
  • 对于需要高交互性的系统来说,这可能不是最佳选择。
  • 对于长时间运行的计算任务,Pipe-Filter系统可能并不适合。

4、Pipe-Filter模式的应用

在Pipe-Filter模式中,管道是由一连串处理单元(如进程、线程或函数等)构成的链条,这些处理单元被安排成串联方式,即一个单元的输出直接成为下一个单元的输入。

这种模式因其灵活性和效率而广受欢迎,被广泛应用于多种系统中,例如UNIX操作系统中的文本处理工具。当面对需要以多种不同方式处理的数据集时,采用Pipe-Filter架构是一个理想的选择。接下来,我们将进一步探讨这种模式的具体使用实例。

4.1、编译器

编译器的核心任务是执行语言转换,即将语言 A 转换为语言 B。为了实现这个过程(如图5-22所示),输入数据在编译器内部经历了多个阶段,这些阶段合起来构成了一个Pipe。这个Pipe最常见的划分为三个主要阶段:前端(front-end)、中端(middle-end)和后端(back-end)。

具体来说,前端主要负责解析输入语言,进行语法和语义分析,并将其转换为中间语言。接下来,中端阶段接收这种中间表示,并在其基础上执行多个优化步骤。优化后的程序随后被传递给后端。最后,后端负责将这些数据转换为目标语言 B。

值得注意的是,每个阶段内部也包括了多个步骤。这些步骤累加起来,共同构成了编译器的完整Pipe。

图5-22

4.2、UNIX Shell

在UNIX shell中,Pipe是其核心特性之一,这同样适用于Linux、MacOS以及其他基于UNIX或受到UNIX启发的系统。

简单来说,Pipe允许将一个程序的输出直接作为另一个程序的输入。这样的设计带来了显著的优势:无需先存储一个程序的结果就可以用另一个程序来处理这些结果。更为深远的好处在于,它促使程序保持小而简单。

比如,如果每个程序都能将输出导入到wc(一个字数统计程序)中,那么就无需在每个程序中都嵌入一个单词计数功能。同理,各程序也不需要各自实现内置的模式匹配功能,因为它们可以将输出导入到grep中进行处理。

举个具体的例子(如图5-23所示),在某个操作中,input.txt文件被读取,其输出接着作为grep的输入。grep在此基础上搜索“text”这一模式,然后将搜索结果传递给sort程序。sort对这些结果进行排序后,最终输出到output.txt文件中。

图5-23

5、总结

Pipe-Filter架构在需要模块化和灵活性的场景中提供了易于维护和可扩展解决方案的有效途径。这种架构最大的优点在于其组件和步骤定义清晰、易于替换和更新,而不需要重新构建整个系统。每个Filter具有明确的输入和输出,确保了数据流的连贯性,同时支持Filter之间的相互替换。

此外,Pipe-Filter架构倡导创建规模小而简洁的程序,这不仅提高了代码的可测试性,还有利于提升系统的整体性能和维护性。Filter的模块化设计还有助于实现负载平衡和性能的优化。

尽管如此,这种架构也存在不容忽视的缺点。例如,特定的解决方案要求可能会限制Filter的可互换性。同时,Filter链条的增加复杂性可能导致性能下降和潜在的冲突。因此,设计时应谨慎考虑Filter的数量和复杂性,避免过度设计。每个步骤应根据实际需要进行合理处理,而不是基于对数据的预设假设。

基础架构模式是面向特定设计问题的验证过的解决方案,旨在提高系统的稳定性和可维护性。这些模式在解决代码组织、通信简化和关注点清晰分离等常见问题方面表现出色。它们被广泛应用于构建小规模应用程序和建立软件基础设施。

分层模式作为最常见的架构模式之一,其核心在于将应用程序的关注点分隔到不同层次,每层承担明确定义的职责。这种模式的显著特点是实现了“关注点分离”,易于管理,且有利于角色和职责的有效分配。

客户端-服务器模式则适用于多台计算机协作完成任务的场景。这种模式的优点包括中心化管理、高安全性、可伸缩性和易于管理。然而,它也存在一些缺点,如流量拥堵、健壮性差、成本高以及维护难度。

主从架构模式广泛用于数据同步策略,由主节点协调数据变更,其他从节点同步数据。这种模式确保了数据的一致性和同步性,适用于提高网站的可靠性和性能。

Pipe-Filter模式是一种由独立的Filter组成的架构模式,每个Filter负责接收输入数据、处理并输出。这种模式的优势在于模块化和灵活性,有利于实现负载平衡和性能优化。但它也可能因Filter的数量和复杂性增加而导致性能问题。