Blog

Blog

PHODAL

架构设计学习——Pipe and Filters模式

继续码点关于架构设计的一些小心得。架构是什么东西并没有那么重要,重要的是知道它存在过。我会面对不同的架构,有一些不同的想法。一个好的项目通常是存在一定的结构,就好像人们在建造房子的时候也都会有结构有一样。

我们看不到的架构,并不意味着这个架构不存在。

Unix Shell

最出名的Pipe便是Unix中的Shell

管道(英语:Pipeline)是原始的软件管道:即是一个由标准输入输出链接起来的进程集合,所以每一个进程的输出(stdout)被直接作为下一个进程的输入(stdin)。 每一个链接都由未命名管道实现。过滤程序经常被用于这种设置。

所以对于这样一个很好的操作便是,统计某种类型的文件的个数:

 ls -alh dot | grep .dot | wc -l

在执行

ls -alh dot

的输出便是下一个的输入,直至最后一个输出。

这个过程有点类似于工厂处理废水,

pipe and filter
pipe and filter

上图是一个理想模型~~。

一个明显地步骤是,水中的杂质越来越少。

Pipe and Filter模式

Pipe and Filter适合于处理数据流的系统。每个步骤都封装在一个过滤器组件中,数据通过相邻过滤器之间的管道传输。

  • pipe: 传输、缓冲数据。
  • filter: 输入、处理、输出数据。

这个处理过程有点类似于我们对数据库中数据的处理,不过可不会有这么多步骤。

Fluent API

这个过程也有点类似于Fluent API、链式调用,只是这些都是DSL的一种方式。

Pipe and Filter模式实战

所以,这个模式实际上更适合处理数据,如用Hadoop处理数据的时候,我们会用类似于如下的方法来处理我们的数据:

A = FOREACH LOGS_BASE GENERATE ToDate(timestamp, 'dd/MMM/yyyy:HH:mm:ss Z') as date, ip, url,(int)status,(int)bytes,referrer,useragent;
B = GROUP A BY (timestamp);
C = FOREACH B GENERATE FLATTEN(group) as (timestamp), COUNT(A) as count;
D = ORDER C BY timestamp,count desc;

每一次都是在上一次处理完的结果后,再处理的。

参考书目

  • 《 面向模式的软件架构:模式系统》
  • 《Java应用架构设计》

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Developer, Consultant, Writer, Designer

ThoughtWorks 高级咨询师

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 与我沟通

标签