Pipes-and-Filters模式

Pipe和Filter模式将执行复杂处理的任务分解为可重复使用的一系列离散元素。这种模式可以提高性能,可扩展性和可重用性,允许执行部署和缩放独立处理的任务元素。

问题

一个应用程序可能根据其处理的不同的信息需要执行各种复杂的任务。一个简单的,但不灵活的方法就是可以将应用的处理作为一个单独的模块。但是,如果部分相同的处理需要在应用程序的其他地方,这种方法可能会减少代码重构,重用,优化的机会。

下图1说明了单独模块方法处理数据的流程。应用程序接收和处理来自两个源的数据。每个源的数据由一个单独的模块处理,它们执行一系列任务来转换这些数据,然后将结果传递给应用程序的业务逻辑。

这里写图片描述
图1.
实现独立模块的解决方案

很多独立模块执行的一些任务在功能上非常相似,但是因为这些模块是分开设计的,实现任务的代码都是紧密耦合在一个模块中,其中的重复部分无法得到重用来提高扩展性和重用性。

然而,每个模块执行的处理任务,或每个任务的部署要求,可能都会随着业务需求的修改而改变。有些任务可能是计算密集型的,可能会受益于运行在强大的硬件,而其他任务可能不需要这样昂贵的资源。此外,在未来可能需要执行一些额外的处理,或命令执行的任务可能会改变。所以需要一个技能解决这些问题,同时也能增加代码重用的解决方案。

解决方案

将每个数据流所需的处理分解成一组离散的组件(或过滤器),然后由每个组件来执行一个任务是一种不错的解决方案。通过标准化每个组件接收和发出的数据的格式,这些组件(过滤器)可以组合成一个管道。这种解决方案有助于避免重复代码,并且在需求发生变化的时候,可以很容易地删除,替换或集成额外的组件来实现功能。图2显示了这种结构的一个例子。

这里写图片描述

图2
通过管道和过滤器的解决方案

处理单个请求的时间取决于管道中最慢的过滤器的速度。尤其在大量请求发送到组件的时候,某个或者某些组件就可能成为系统的性能瓶颈。管道结构的一个主要优点就在于,它为运行缓慢的过滤器提供了使用并行实例的机会,这样使系统能够均衡负载,以提高吞吐量。

组成管道的过滤器完全可以运行在不同的机器上,并且它们可以利用许多云环境提供的弹性能够来实现独立扩展。一个计算密集型的过滤器可以运行在高性能硬件上,而其他要求较低的过滤器可以运行在稍差的硬件上。过滤器甚至不必在相同的数据中心或不在同一个地点,管道解决方案允许管道中的每个元素可以在接近其所需资源的环境中运行。

图3展示了一个应用了管道处理数据流的例子:

这里写图片描述

图3
管道中组件的负载分担

如果一个过滤器的输入和输出被结构化为一个流,它就有可能对多个过滤器进行并行处理。管道中的第一个过滤器可以开始它的工作,并开始分发它的处理结果,这是直接传递到下一个过滤器的序列之前,第一个过滤器已完成其工作。

另一个好处是管道过滤器模式可以提供很好的跳转。如果过滤器失败或正在运行的机器不再可用,则管道可以重新安排过滤器正在执行的工作,并将此工作直接指向组件的另一实例。一个过滤器的故障并不会导致整个管道的故障。

使用管道和过滤器模式与

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值