管道过滤器模式将执行复杂处理的任务分解为可重复使用的一系列离散元素,这种模式能够提升性能,可扩展性和可重用性,容许执行部署和缩放独立处理的任务元素。java
整个应用的处理能够被分解成一系列离散的,独立的步骤的状况下,能够考虑使用管道过滤器模式。web
当应用处理的不一样的步骤,有不一样的扩展性需求的状况下,能够考虑实现管道过滤器模式。服务器
若是须要较强的灵活性的时候,能够考虑使用管道过滤器模式。管道过滤器模式令应用能够灵活的配置不一样的执行步骤和执行序列,并且应用还能够按需来增长或者减小对应的处理单元。网络
当须要最大化服务器利用率的时候,能够选择管道过滤器模式。架构
若是解决方案须要保证的可靠,须要尽可能下降每个单独的处理单元中执行的失败的可能性的时候,能够考虑使用管道过滤器模式。app
管道过滤器模式将执行复杂处理的任务分解为可重复使用的一系列离散元素,这种模式能够提升性能,可扩展性和可重用性,容许执行部署和缩放独立处理的任务元素。分布式
一个应用程序可能根据其处理的不一样的信息须要执行各类复杂的任务。一个简单的,但不灵活的方法就是能够将应用的处理做为一个单独的模块。可是,若是部分相同的处理须要在应用程序的其余地方,这种方法可能会减小代码重构,重用,优化的机会。性能
不少独立模块执行的一些任务在功能上很是类似,可是由于这些模块是分开设计的,实现任务的代码都是紧密耦合在一个模块中,其中的重复部分没法获得重用来提升扩展性和重用性。优化
然而,每一个模块执行的处理任务,或每一个任务的部署要求,可能都会随着业务需求的修改而改变。有些任务多是计算密集型的,可能会受益于运行在强大的硬件,而其余任务可能不须要这样昂贵的资源。此外,在将来可能须要执行一些额外的处理,或命令执行的任务可能会改变。因此须要一个技能解决这些问题,同时也能增长代码重用的解决方案。加密
将每一个数据流所需的处理分解成一组离散的组件(或过滤器),而后由每一个组件来执行一个任务是一种不错的解决方案。经过标准化每一个组件接收和发出的数据的格式,这些组件(过滤器)能够组合成一个管道。这种解决方案有助于避免重复代码,而且在需求发生变化的时候,能够很容易地删除,替换或集成额外的组件来实现功能。
处理单个请求的时间取决于管道中最慢的过滤器的速度。尤为在大量请求发送到组件的时候,某个或者某些组件就可能成为系统的性能瓶颈。管道结构的一个主要优势就在于,它为运行缓慢的过滤器提供了使用并行实例的机会,这样使系统可以均衡负载,以提升吞吐量。
组成管道的过滤器彻底能够运行在不一样的机器上,而且它们能够利用许多云环境提供的弹性可以来实现独立扩展。一个计算密集型的过滤器能够运行在高性能硬件上,而其余要求较低的过滤器能够运行在稍差的硬件上。过滤器甚至没必要在相同的数据中心或不在同一个地点,管道解决方案容许管道中的每一个元素能够在接近其所需资源的环境中运行。
若是一个过滤器的输入和输出被结构化为一个流,它就有可能对多个过滤器进行并行处理。管道中的第一个过滤器能够开始它的工做,并开始分发它的处理结果,这是直接传递到下一个过滤器的序列以前,第一个过滤器已完成其工做。
另外一个好处是管道过滤器模式能够提供很好的跳转。若是过滤器失败或正在运行的机器再也不可用,则管道能够从新安排过滤器正在执行的工做,并将此工做直接指向组件的另外一实例。一个过滤器的故障并不会致使整个管道的故障。
使用管道和过滤器模式与事务补偿模式相结合,能够提供一种替代的方法来实现分布式事务。分布式事务能够分解成独立的有偿任务,每个均可以经过使用一个过滤器,还实现了事务补偿模式。管道中的过滤器能够做为独立的托管任务来执行,这些任务还能够在物理位置上接近他们所维护的数据,以下降网络代价。
Servlet Filter
凡是开发过J2EE的web application的人员都知道,常常须要处理如下几种状况:
在servlet2.3以前这些功能处理是很难实现的,可是Java Servlet 2.3 规范新增了很多激动人心的功能,其中之一即是过滤器(Filter),其实这就是咱们所说的管道和过滤器体系架构在J2EE中的应用实践. 经过使用该模式使得Web Application开发者可以在请求到达Web资源以前截取请求,在处理请求以后修改应答。
一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法: