浅谈管道模型(Pipeline)

本篇和大家谈谈一种通用的设计与处理模型——Pipeline(管道)。

Pipeline简介

Pipeline模型最早被使用在Unix操作系统中。据称,如果说Unix是计算机文明中最伟大的发明,那么,Unix下的Pipe管道就是跟随Unix所带来的另一个伟大的发明【1】。我认为管道的出现,所要解决的问题,还是软件设计中老生常谈的设计目标——高内聚,低耦合。它以一种“链式模型”来串接不同的程序或者不同的组件,让它们组成一条直线的工作流。这样给定一个完整的输入,经过各个组件的先后协同处理,得到唯一的最终输出。

Pipeline模型的应用

以下列举了,我熟悉或者有所了解的典型pipeline模型的应用。

公司.net
web程序员很多,那么首先就谈谈asp.net。一个http请求到达http服务器IIS之后,就是经过pipeline模型被处理的。参见下图:

说明一下,这幅图,并没有下面的图形来得直观。它的侧重点在于展示管道中各个组件处理事件触发的时序图,而不是pipeline模型。但如果你思考以下,也能体会到其中“管道”的概念(注意右面循环图标,如果需要比划一下的话,就是一个U逆时针旋转90度的形状)。

最后,我还是决定上个清晰点的图:

上图可以请求到达IIS,经过HttpApplication工厂得到一个HttpApplication,创建一个HttpContext上下文,然后就会进入Http
Pipeline。好了,这篇的目标并不是谈论http处理行为以及asp.net底层架构,所以到此为止。

又一个大家熟悉的web container,特别是java web人员——Tomcat

Tomcat接受请求之后,请求从被接受,被分发,被处理,到最后转变成http响应,会走如下的管道【2】:

在《Tomcat系统架构与设计模式,第2部分:
设计模式分析》【3】中,你可以清晰地发现一个最为显而易见的设计模式——责任链模式(这是实现管道模型比较常用的一种设计模式)

可见,pipeline模型几乎是大部分主流http
server处理请求的通用模型。这种设计并不意外,因为pipeline模型特定的理念会让你感觉到它似乎就是为了处理请求而生的。事实上,它的应用原不止这些web
服务器架构。

下面,给大家带来的另一个典型示例也是在web架构里广为人知的MVC模型的良好实践——Struts:

我认为用这幅图来阐述Pipeline最为清晰,简洁。从上面这幅图中你能够看到对于pipeline模型的多处使用(单向、双向都有)。它也很好地展示了高内聚,低耦合的设计目标,展示了各个组件以类似“搭建积木”的形式来组合功能(见图中Interceptor),我最近有空也在读struts2的源码,如果你也有兴趣,可以看看这个专题

最后一个示例了,公司Java服务器的开发人员,相信都会对Mina框架有所了解。下面是Mina的处理模型图:

不再废话了,同样是pipeline的优秀实践。

上面介绍了很多pipeline的优秀实践,他们并非来自同一个领域,有web端,有处理socket的等。但对于他们的一个归纳,可以是——优秀的服务端数据处理模型,我觉得公司在数据处理上比较频繁,这也是选择介绍pipeline模型的原因。

Pipeline模型带来的启示

其实,关于它的好处已经在上面各种优秀的实践中得以体现。但你还是应该能够从中去发现一些能够为我们所用的设计思想。我总结了我得一些观点,欢迎各位拍砖:

(1) 工作流的参考模型

上面的各个模型图很难让我不把pipeline模型与工作流模型联想到一块儿去。他们都是链式的(或者说流程式的),就像一条生产线一样。各个组件的前后协同,会让你联想到生产流水线上得工人处理流过自己的产品环节。事实上,我在去年年末的时候在云方圆徐工基础任务流程里面曾经尝试使用了该模型,作为工作流模型

(2) 服务framework的参考构建模型

Pipeline模型的一个特点是,在其内部是以组建的模式来实现组合的(虽然这些组建有先后顺序之分),它假如你把侧重点放在它的链式组合上,而不是将侧重点放在上面的工作流上(工作流的关注点是流程的先后顺序),那么完全可以用这种方式来搭建一个复杂的服务,当然这样做的前提是,单个组件的粒度必须尽可能小并且耦合性极低。

在这里我冒昧吐槽几句:

在我的印象中,公司很多服务都喜欢采用WebService,即使不是Web Service也是Http
GET请求。当然,这其中的很多情况是不得不采用它来和别的系统或者业务平台交互。但我一直坚持认为,只有在理论上你根本没有可能拿到那些数据时,你才会采用别人提供的服务,比如:股票行情、天气预报、各大开放平台(新浪、支付宝)的API的等。本公司之内的,原则上其实可以访问的某些数据,有时我们反而退而求其次选择采用Web
Service这种模式。批量数据走http或者之上的协议(SOAP)在网络上传输,有时web系统还有可能发布在远端。想要性能从哪儿来?我了解你担心安全性,希望保持本业务平台数据库的独立性。告诉我,其实你也明白有些担心是没有意义的。我直接连你的库,只做一些查询会有什么问题?如果你真的比较谨慎的话,你也应该担心一下你的系统有被攻击的可能性,为什么你没有呢。甚至有人希望,某些相似的业务逻辑也把他抽象出来在dll外面包装成web
service。如果真得是这样的话,我觉得“可复用的组件”这个词就没有必要存在了。

Pipeline模型应用

刚才谈到,我认为Pipeline模型带来的启示,我个人更看好第二点。我认为在NGP构建API的时候,这种模型也能够派上大用场。

就拿Redis举个例子(在一些场景下):

读取数据流程

(1) 客户程序从Redis读取数据,如果读取到则返回

(2) 如果没有读取到,则从数据库抓取数据

(3) 从数据库抓取到的数据存储到Redis

写入数据流程

(1) 客户程序将数据写入Redis

(2) 将数据写入数据库

假如有一天,你不打算采用Redis,或者Redis服务全部不可用。你怎么让客户端自己能够“智能感知”,让这些巨大的后端变动对于客户端透明,并且不会产生调用异常?那么Pipeline模型,就可以派上用场。因为上面这些流程都是可配置的,而开放的API是唯一的。

你是否会觉得普通的封装也能够实现上面的读取数据流程?没错,也可以。但我认为Pipeline模型带来的:流程式(有序)+可拆卸(配置),比普通的封装机动性更好。

当然,这里只是选择了一个简单的场景来举个例子。

Pipeline模型实现

其实在上面那个Tomcat的设计模式截图中已经看到,实现该模型最通常的设计模式就是责任链模式,在上面工作流那篇文章中,也是采用责任链模式来实现,但我当时忽略了一个非常重要的东西——Context,这是串联整个Pipeline的重要前提。

你找到一篇任何介绍责任链模式的文章,然后搭配淘宝的《基于管道模式的容器设计》【4】就基本能够完全了解Pipeline。

Pipeline模式的缺点

没有那种模式是完美的。Pipeline模式的缺点是,每次它对于一个输入(或者一次请求)都必须从链头开始遍历(参考Http
Server处理请求就能明白),这确实存在一定的性能损耗。

引用

【1】:Unix Pipes
管道原稿

【2】:Servlet工作原理解析

【3】:Tomcat系统架构与设计模式,第 2 部分: 设计模式分析

【4】:基于管道模式的容器设计

原文发布时间为:2012-05-12

本文作者:vinoYang

时间: 2024-11-02 23:46:03

浅谈管道模型(Pipeline)的相关文章

跨越边界:浅谈Java模型以外的类型策略

当谈到 Java 语言的类型方法时,Java 社区分为两大阵营.一些人喜欢编译时错误检查,更好的安全 性,以及改善的工具 -- 这些都是静态类型所能提供的特性.而另一些人则偏爱更动态的类型体验.这 一次在 跨越边界 中,您将看到两种高生产力的非 Java 语言所使用的一些截然不同的类型策略,并发现 在 Java 编程中提高类型灵活性的一些方法. 在对任何编程语言的讨论中,争议较大的一个问题就是类型模型.类型决定可以使用哪些种类的工具 ,并影响到应用程序的设计.很多开发人员将类型与生产率或可维护性

浅谈socket同步和异步、阻塞和非阻塞、I/O模型_php技巧

在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针对C端: 同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果 例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:c端一个异步过程调用发出后,调用者不会立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者. 例如:ajax请求(异步): 事件触发->服务

浅谈sem漏斗模型每个要点

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 这个sem漏斗型模式,相信做sem人员都了解,做sem要步步为营,解决好每一步,你就离成功不远了,以下我就浅谈一下这个模型的每一步吧. 1,展现量,用户要看到你的推广信息,那账户的关键词就得展现在用户,那展现量与什么有关呢? ①匹配模式,(更改匹配模式,让更多潜在用户看到你的推广信息). ②关键词排名,关键词排名越靠前,用户就越容易看

读百度《浅谈网页搜索排序的投票模型》有感

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 百度搜索研发部官方博客的那篇<浅谈网页搜索排序中的投票模型>不知道大家有没有仔细看过,如果没有看过,建议大家可以认真的看一下,个人觉得这篇文章的观点对于我们SEO工作者来说,是一个比较靠谱的深入网页排名研究方向,里面谈到关于选举投票的很多困境,每种选举办法都有自己的弊端,作者再结合这些选举的方法,谈到在网页搜索排名投票原理中需要注

浅谈 HTTPS 和 SSL/TLS 协议的背景与基础

浅谈 HTTPS 和 SSL/TLS 协议的背景与基础 相关背景知识 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 大致了解 HTTP 和 TCP 的关系(尤其是"短连接"VS"长连接") 大致了解加密算法的概念(尤其是"对称加密与非对称加密"的区别) 大致了解 CA 证书的用途 考虑到很多技术菜鸟可能不了解上述背景,俺先用最简短的文字描述一下.如果你自认为不是菜鸟,请

浅谈Angular中ngModel的$render_AngularJS

在我开始着手ngModel的领域时候,有一个问题很令我纠结,那就是$render()到底是做什么的呢?查了很多资料都只是简单的描述一下,这就令我很纠结了,终于在一个阳光明媚的晚上,我终于解决了这个大问题 那么这个$render方法到底是干什么的呢?他的用处就是在$viewValue改变的时候可以重新绑定model数据,但是我们要注意一点($viewValue和DOM节点的value是不同的),我觉得他们的区别有点类似setTimeout和$timeout的区别,但是又不太一样.ps:其实mode

浅谈开源大数据平台的演变

浅谈开源大数据平台的演变 2015-04-16 腾讯大数据一说到开源大数据处理平台,就不得不说此领域的开山鼻祖Hadoop,它是GFS和MapReduce的开源实现.虽然在此之前有很多类似的分布式存储和计算平台,但真正能实现工业级应用.降低使用门槛.带动业界大规模部署的就是Hadoop.得益于MapReduce框架的易用性和容错性,以及同时包含存储系统和计算系统,使得Hadoop成为大数据处理平台的基石之一.Hadoop能够满足大部分的离线存储和离线计算需求,且性能表现不俗:小部分离线存储和计算

浅谈ASP.NET MVC 3中如何使用Model

昨天博客发了新文章,讲一下我对如何使用MVC中的Model的看法,不是什么大技术,当是一个技术讨论^^ 原文地址:http://www.youguanbumen.net/Article.aspx?id=79 原文: 前两天写了个文章ASP.NET MVC 3 -- Model远程验证,主要记录了一下ASP.NET MVC 3中新增的RemoteAttribute类的使用,得益于这个类,我们可以在模型中为属性配置客户端远程校验的业务,文章中给了出一个简单的实体类MyUser_Add,举了一个最常见

浅谈权限管理的对象模型和实现

对象 浅谈权限管理的对象模型和实现    beegee(原作) 关键字    权限管理 对象模型 ACL 电子政务 浅谈权限管理的对象模型和实现 beegee (2003-7-16) 目录: 1.权限管理问题的分析 1.1权限管理简要分析 1.2电子政务系统的权限管理 1.3商业化应用系统的权限管理 1.4他山之石 2.权限管理子系统设计 2.1权限管理子系统的总体目标 2.2权限管理子系统的对象模型 2.3注意与不足 3.权限管理子系统的实现 3.1面向对象的实现 3.2组件层与功能层对对象的