軟件架構風格系列(3):管道 - 過濾器架構


文章目錄

  • 前言
  • 一、從生活場景到架構原理,看懂管道 - 過濾器的核心邏輯
    • (一)什么是管道 - 過濾器架構?
    • (二)核心組件拆解
  • 二、架構設計圖:一圖看懂管道 - 過濾器架構全貌
  • 三、Java 示例代碼:手把手教你實現管道 - 過濾器架構
    • (一)定義過濾器接口
    • (二)實現具體過濾器
    • (三)實現管道類
    • (四)使用示例
  • 四、管道 - 過濾器架構的優勢與適用場景
    • (一)核心優勢
    • (二)適用場景
  • 五、使用管道 - 過濾器架構的注意事項
  • 總結

前言

在互聯網技術的高速發展中,系統架構的設計直接影響著軟件的性能與可維護性。當你在使用 ETL 工具處理海量數據,或是在編譯器中實現代碼的層層解析時,背后往往都有一個低調卻強大的架構風格在支撐 —— 管道 - 過濾器架構。作為一個在系統架構領域摸爬滾打多年的老濕機,今天就來和大家深度剖析這個 “數據處理利器”,帶你從理論到實踐吃透它!

一、從生活場景到架構原理,看懂管道 - 過濾器的核心邏輯

(一)什么是管道 - 過濾器架構?

**管道 - 過濾器架構,顧名思義,其靈感來源于現實生活中的流水線作業。**想象一下工廠里的汽車組裝流水線,每個工位的工人負責特定的組裝步驟,零件依次從一個工位傳遞到下一個工位,最終完成汽車的組裝。

在軟件架構中,“過濾器” 就如同流水線上的工位工人,負責對數據進行特定處理;“管道” 則是連接這些工位的傳送帶,負責將數據從一個過濾器傳輸到下一個過濾器。

每個過濾器都有明確的輸入和輸出,它們相互獨立,只專注于自己的處理任務,如數據清洗、格式轉換、邏輯校驗等。數據通過管道在各個過濾器之間流動,形成一條完整的數據處理鏈路。

例如,在一個日志分析系統中,數據首先經過 “日志采集過濾器” 收集原始日志,然后通過管道傳遞給 “日志清洗過濾器” 去除無效信息,接著再傳遞給 “日志分析過濾器” 提取關鍵數據,最后輸出分析結果。

(二)核心組件拆解

過濾器(Filter):過濾器是無狀態的處理單元,它只根據輸入數據產生輸出,不會受到其他過濾器或系統狀態的影響。比如在編譯器中,“詞法分析過濾器” 會將源代碼分解成一個個單詞,不依賴后續的語法分析過程。

管道(Pipe):管道負責數據的傳輸,它可以是同步傳輸,也可以是異步傳輸,甚至支持數據緩沖。像 Unix 系統中的管道符 “|”,就是典型的管道實現,它能將一個命令的輸出作為另一個命令的輸入。在軟件系統中,消息隊列(如 Kafka)也可以充當管道的角色,實現數據在不同過濾器之間的異步傳遞。

數據流(Data Flow):數據流決定了數據在過濾器之間的流動方向和順序。它支持增量處理,即前一個過濾器無需完全處理完所有數據,就可以將部分結果傳遞給下一個過濾器,從而提高整體處理效率。

二、架構設計圖:一圖看懂管道 - 過濾器架構全貌

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

在這張架構設計圖中,最上方的 A 節點代表數據源,數據從這里開始進入處理流程。緊接著是一系列的過濾器(B - F),每個過濾器負責不同的數據處理任務。數據通過管道(管道 1 - 管道 3)在過濾器之間有序流動,最終到達數據目標 G,完成整個數據處理過程。通過這張圖,我們可以清晰地看到管道 - 過濾器架構中各組件之間的關系和數據的流向。

三、Java 示例代碼:手把手教你實現管道 - 過濾器架構

(一)定義過濾器接口

public interface Filter<T> {//對輸入數據進行處理并返回處理結果T process(T input);
}

這里定義了一個泛型接口Filter,它只有一個方法process,用于對輸入數據進行處理并返回處理結果。

(二)實現具體過濾器

以一個簡單的文本處理為例,我們實現兩個過濾器:“文本大寫轉換過濾器” 和 “文本添加前綴過濾器”。

// 文本大寫轉換過濾器
public class UppercaseFilter implements Filter<String> {@Overridepublic String process(String input) {return input.toUpperCase();}
}// 文本添加前綴過濾器
public class PrefixFilter implements Filter<String> {@Overridepublic String process(String input) {return "處理后: " + input;}
}

(三)實現管道類

import java.util.ArrayList;
import java.util.List;public class Pipeline<T> {private final List<Filter<T>> filters = new ArrayList<>();//向管道中添加過濾器public Pipeline<T> addFilter(Filter<T> filter) {this.filters.add(filter);return this;}//按照順序依次調用每個過濾器的process方法,對輸入數據進行處理public T execute(T input) {T output = input;for (Filter<T> filter : filters) {output = filter.process(output);}return output;}
}

Pipeline類中,我們使用一個List來存儲過濾器。addFilter方法用于向管道中添加過濾器,execute方法則按照順序依次調用每個過濾器的process方法,對輸入數據進行處理。

(四)使用示例

public class Main {public static void main(String[] args) {Pipeline<String> pipeline = new Pipeline<>();pipeline.addFilter(new UppercaseFilter()).addFilter(new PrefixFilter());String input = "hello world";String result = pipeline.execute(input);System.out.println(result);}
}

main方法中,我們創建了一個Pipeline對象,并向其中添加了兩個過濾器。然后輸入一段文本 “hello world”,經過管道處理后,最終輸出 “處理后: HELLO WORLD”。

四、管道 - 過濾器架構的優勢與適用場景

(一)核心優勢

高內聚低耦合:每個過濾器獨立完成自己的任務,與其他過濾器之間的耦合度極低。例如在電商系統的訂單處理中,“庫存檢查過濾器” 和 “支付處理過濾器” 可以獨立開發和維護,一個過濾器的修改不會影響到另一個。

可擴展性強:當業務需求發生變化,需要增加新的數據處理邏輯時,只需新增一個過濾器并將其添加到管道中即可,無需對整個系統進行大規模改動。

支持并行處理:多個過濾器可以并行運行,提高數據處理效率。比如在圖像處理系統中,“圖像縮放過濾器” 和 “圖像色彩調整過濾器” 可以同時對圖像進行處理。

(二)適用場景

數據處理系統:如 ETL(Extract - Transform - Load)工具,用于從不同數據源提取數據,進行轉換后加載到數據倉庫中。

編譯器:編譯器的各個階段(詞法分析、語法分析、語義分析等)可以看作是過濾器,通過管道依次處理源代碼。

Web 應用中間件:在 Web 應用中,請求處理過程可以使用管道 - 過濾器架構,例如通過過濾器實現請求日志記錄、身份認證、參數校驗等功能。

五、使用管道 - 過濾器架構的注意事項

雖然管道 - 過濾器架構有諸多優勢,但也并非適用于所有場景。在使用時需要注意:

數據格式一致性:各個過濾器之間的數據格式需要保持一致,否則在管道傳輸過程中可能會出現問題。這就要求在設計過濾器時,明確輸入和輸出的數據格式標準。

性能開銷:如果管道中過濾器數量過多,數據在管道中的傳輸和處理可能會帶來一定的性能開銷。因此需要合理規劃過濾器的數量和處理邏輯,避免性能瓶頸。

錯誤處理:由于過濾器之間相互獨立,當某個過濾器出現錯誤時,需要有完善的錯誤處理機制,確保不會影響整個系統的穩定性。

總結

管道 - 過濾器架構它就像一把 “瑞士軍刀”,在數據處理領域有著廣泛的應用和強大的能力。無論是在實際項目中,還是在技術學習過程中,掌握這種架構風格都能為我們帶來更多的思路和解決方案。


圖片來源網絡

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83681.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83681.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【VIM】vim 常用命令

文章目錄 插入模式光標移動拷貝/粘貼/刪除/撤銷塊操作分屏代碼縮進命令組合使用其他PowerVim 前言&#xff1a;本文內容大部分摘抄自酷殼和博客園 ? – ? CoolShell – 陳皓 ? 博客園 – 易先訊 插入模式 a → 在光標后插入o → 在當前行后插入一個新行O → 在當前行前插…

polarctf-web-[簡單rce]

考點&#xff1a; (1)RCE(eval函數) (2)執行函數(passthru函數) (3)/頂級(根)目錄查看 (4)sort排序查看函數 題目來源&#xff1a;Polarctf-web-[簡單rce] 解題&#xff1a; 代碼審計 <?php/*?PolarD&N CTF?*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs開發之———使用HTTP訪問網絡資源

謝謝關注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介紹HarmonyOs開發之———Video組件的使用:HarmonyOs開發之———Video組件的使用_華為 video標簽查看-CSDN博客 HarmonyOS 網絡開發入門&#xff1a;使用 HTTP 訪問網絡資源 HarmonyOS 作為新一代智能終端…

Vue 圖片預覽功能(含縮略圖)

眾所周知&#xff0c;常見的組件庫如Element、Ant Design&#xff0c;自帶的圖片預覽功能都沒有縮略圖&#xff0c;所以 需要單獨封裝一個圖片預覽的服務。 第三方庫&#xff1a;v-viewer 安裝&#xff1a; npm install v-viewer viewerjs 若使用報錯&#xff0c;可安裝指定…

手寫tomcat:基本功能實現(4)

邏輯架構 HTTP 請求與 Socket&#xff1a; 左側的 “HTTP 請求” 箭頭指向 “socket”&#xff0c;表示客戶端發送的 HTTP 請求通過 socket 傳輸到服務器。Socket 負責接收請求&#xff0c;并提取出其中的 請求路徑&#xff08;如 /first&#xff09;和 請求方法&#xff08;如…

jvm安全點(一)openjdk17 c++源碼垃圾回收安全點信號函數處理線程阻塞

1. 信號處理入口?? ??JVM_HANDLE_XXX_SIGNAL?? 是 JVM 處理信號的統一入口&#xff0c;負責處理 SIGSEGV、SIGBUS 等信號。??javaSignalHandler?? 是實際注冊到操作系統的信號處理函數&#xff0c;直接調用 JVM_HANDLE_XXX_SIGNAL。 ??2. 安全點輪詢頁的識別?? …

微信小程序:封裝表格組件并引用

一、效果 封裝表格組件,在父頁面中展示表格組件并顯示數據 二、表格組件 1、創建頁面 創建一個components文件夾,專門用于存儲組件的文件夾 創建Table表格組件 2、視圖層 (1)表頭數據 這里會從父組件中傳遞表頭數據,這里為columns,后續會講解數據由來 循環表頭數組,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 發送、2 路 TLK2711 接收 FMC 子卡模塊

產品概述 FMC216 是一款基于 VITA57.1 標準規范的 2 路 TLK2711 接收、2 路 TLK2711 發送 FMC 子卡模塊。該板卡支持 2 路 TLK2711 數據的收發&#xff0c;支持線速率 1.6Gbps&#xff0c;經過 TLK2711 高速串行收發器&#xff0c;可以將 1.6Gbps 的高速串行數據解串為 16 位并…

K8S Gateway API 快速開始、胎教級教程

假設有如下三個節點的 K8S 集群&#xff1a; ?? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至網關 API 中。在 Kubernetes …

時序數據庫IoTDB分布式架構解析與運維指南

一、IoTDB分布式架構概述 分布式系統由一組獨立的計算機組成&#xff0c;通過網絡通信&#xff0c;對外表現為一個統一的整體。IoTDB的原生分布式架構將服務分為兩個核心部分&#xff1a; ?ConfigNode&#xff08;CN&#xff09;?&#xff1a;管理節點&#xff0c;負責管理…

Ubuntu 20.04 LTS 中部署 網頁 + Node.js 應用 + Nginx 跨域配置 的詳細步驟

Ubuntu 20.04 LTS 中部署 網頁 Node.js 應用 Nginx 跨域配置 的詳細步驟 一、準備工作1、連接服務器2、更新系統 二、安裝 Node.js 環境1、安裝 Node.js 官方 PPA&#xff08;用于獲取最新穩定版&#xff09;&#xff1a;2、安裝 Node.js 和 npm&#xff08;LTS 長期支持版本…

3DVR制作的工具或平臺

3DVR&#xff08;三維虛擬現實&#xff09;是利用三維圖像技術和虛擬現實技術&#xff0c;將真實場景進行三維掃描并轉換成計算機可識別的三維模型&#xff0c;使用戶能夠在虛擬空間中自由漫游&#xff0c;體驗身臨其境的感覺。3DVR技術結合了全景拍攝和虛擬現實&#xff0c;提…

垂直智能體:企業AI落地的正確打開方式

在當前AI浪潮中&#xff0c;許多企業急于跟進&#xff0c;推出自己的AI智能體解決方案。然而&#xff0c;市場上大量出現的"萬能型"智能體卻鮮有真正解決實際問題的產品。本文將探討為何企業應該專注于開發垂直領域智能體&#xff0c;而非追求表面上的全能&#xff0…

軟件工程各種圖總結

目錄 1.數據流圖 2.N-S盒圖 3.程序流程圖 4.UML圖 UML用例圖 UML狀態圖 UML時序圖 5.E-R圖 首先要先了解整個軟件生命周期&#xff1a; 通常包含以下五個階段&#xff1a;需求分析-》設計-》編碼 -》測試-》運行和維護。 軟件工程中應用到的圖全部有&#xff1a;系統…

王者榮耀游戲測試場景題

如何測試一個新英雄&#xff1a;方法論與實踐維度 測試一個新英雄不僅僅是“打打打”&#xff0c;而是一套完整的測試流程&#xff0c;包括設計文檔驗證、功能驗證、數值驗證、性能驗證、交互驗證等。可以從以下多個角度展開&#xff1a; &#x1f50d; 1. 方法論維度 ? 測試…

第四天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 很抱歉的說一下&#xff0c;我昨天看白色巨塔電視劇&#xff0c;看的入迷了&#xff0c;同時也看出一些道理&#xff0c;學到東西&#xff1b; 但是把昨天的寫事情給忘記了&#xff0c;今天…

多模態大語言模型arxiv論文略讀(七十八)

AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文標題&#xff1a;AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文作者&#xff1a;Zhen Xing, Qi Dai, Zejia Weng, Zuxuan W…

優化 Spring Boot 應用啟動性能的實踐指南

1. 引言 Spring Boot 以其“開箱即用”的特性深受開發者喜愛,但隨著項目復雜度的增加,應用的啟動時間也可能會變得較長。對于云原生、Serverless 等場景而言,快速啟動是一個非常關鍵的指標。 2. 分析啟動過程 2.1 啟動階段概述 Spring Boot 的啟動流程主要包括以下幾個階…

Ubuntu下配置VScode出現#include錯誤請更新includePath的解決方法

首先Ubuntu新手小白一定要先安裝g&#xff0c;安裝方法是&#xff1a; 在桌面右鍵打開終端&#xff0c;輸入&#xff1a;sudo apt-get install g 安裝好g之后&#xff0c;在vscode終端輸入&#xff1a;g -v -E -x c - 輸出這些路徑&#xff0c;復制 如果還存在顯示cout不存在的…

【背包dp】小結

背包問題總結 一、什么是背包問題&#xff1f; 定義&#xff1a;給定一個容量為 W 的背包和 n 件物品&#xff0c;每件物品有一個重量 w[i] 和價值 v[i]&#xff0c;要求選擇若干物品放入背包&#xff0c;在不超過容量的前提下&#xff0c;使總價值最大。 背包問題本質是&am…