主頁 > 軟體設計 > 從“訊息佇列”到“服務總線”和“流處理平臺”

從“訊息佇列”到“服務總線”和“流處理平臺”

2021-03-08 11:45:40 軟體設計

作者簡介

Gavin,程式員、軟體架構師、企業架構師,關注智能制造,

本文是專欄《智能制造系統架構》中的文章,其它文章請參閱入坑智能制造系統架構,

訊息佇列是分布式系統中重要的組件,也是企業不同應用系統集成的關鍵中間件,目前常用的Kafka、RabbitMQ、ActiveMQ、ZeroMQ、RocketMQ等都是屬于訊息佇列,而在企業IT架構中,還會使用到服務總線、流處理平臺等技術概念或組件,
本文為你梳理一下訊息佇列是做什么的?何時使用訊息佇列?企業服務總線和流處理平臺和它又是什么關系?希望對你有所幫助,

目錄

什么是佇列

什么是訊息佇列

訊息佇列的優勢

訊息模型——如何發布和獲取訊息

Point-to-Point(PTP)模型

Publisher/Subscriber (Pub/Sub) 模型

何時使用訊息佇列

服務總線

流處理平臺——Kafka

參考資料


什么是佇列

佇列是一種先進先出的資料結構,特殊之處在于它只允許在佇列的前端(front)進行洗掉操作,而在佇列的后端(rear)進行插入操作,

什么是訊息佇列

訊息佇列就是一個佇列結構的中間件,也就是說訊息放入這個中間件之后就可以直接回傳,并不需要系統立即處理,而另外會有一個程式讀取這些資料,并按順序進行逐次處理,

訊息佇列的優勢

訊息佇列的核心功能就是訊息傳遞,但由于其異步性和訊息存盤的特定,使訊息佇列具備如下優勢:

1. 解耦

訊息佇列在處理程序中間插入了一個隱含的、基于資料的介面層,兩邊的處理程序都要實作這一介面,這允許你獨立的擴展或修改兩邊的處理程序,只要確保它們遵守同樣的介面約束,

2. 冗余

有時在處理資料的時候處理程序會失敗,除非資料被持久化,否則將永遠丟失,訊息佇列把資料進行持久化直到它們已經被完全處理,通過這一方式規避了資料丟失風險,在被許多訊息佇列所采用的"插入-獲取-洗掉"范式中,在把一個訊息從佇列中洗掉之前,需要你的處理程序明確的指出該訊息已經被處理完畢,確保你的資料被安全的保存直到你使用完畢,

3. 擴展性

因為訊息佇列解耦了你的處理程序,所以增大訊息入隊和處理的頻率是很容易的;只要另外增加處理程序即可,不需要改變代碼、不需要調節引數,擴展就像調大電力按鈕一樣簡單,

4. 靈活性 & 峰值處理能力

在訪問量劇增的情況下,你的應用仍然需要繼續發揮作用,但是這樣的突發流量并不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費,使用訊息佇列能夠使關鍵組件頂住增長的訪問壓力,而不是因為超出負荷的請求而完全崩潰,

5. 可恢復性

當體系的一部分組件失效,不會影響到整個系統,訊息佇列降低了行程間的耦合度,所以即使一個處理訊息的行程掛掉,加入佇列中的訊息仍然可以在系統恢復后被處理,而這種允許重試或者延后處理請求的能力通常是造就一個略感不便的用戶和一個沮喪透頂的用戶之間的區別,

6. 送達保證

訊息佇列提供的冗余機制保證了訊息能被實際的處理,只要一個行程讀取了該佇列即可,

7.排序保證

在許多情況下,資料處理的順序都很重要,訊息佇列本來就是排序的,并且能保證資料會按照特定的順序來處理,

8.緩沖

在任何重要的系統中,都會有需要不同的處理時間的元素,例如,加載一張圖片比應用過濾器花費更少的時間,訊息佇列通過一個緩沖層來幫助任務最高效率的執行--寫入佇列的處理會盡可能的快速,而不受從佇列讀的預備處理的約束,該緩沖有助于控制和優化資料流經過系統的速度,

9. 理解資料流

在一個分布式系統里,要得到一個關于用戶操作會用多長時間及其原因的總體印象,是個巨大的挑戰,訊息系列通過訊息被處理的頻率,來方便的輔助確定那些表現不佳的處理程序或領域,這些地方的資料流都不夠優化,

10. 異步通信

很多時候,你不想也不需要立即處理訊息,訊息佇列提供了異步處理機制,允許你把一個訊息放入佇列,但并不立即處理它,你想向佇列中放入多少訊息就放多少,然后在你樂意的時候再去處理它們,

訊息模型——如何發布和獲取訊息

JMS(Java Message Service,Java訊息服務)API是一個訊息服務的標準/規范,允許應用程式組件基于JavaEE平臺創建、發送、接收和讀取訊息,在JMS標準中,有兩種訊息模型:P2P(Point to Point),Publish/Subscribe(Pub/Sub),

Point-to-Point(PTP)模型

在P2P模型中,每個訊息只有一個消費者(即一旦被消費,訊息就不再在訊息佇列中),佇列保留著訊息,直到它們被消費或超時,發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了訊息之后,不管接收者有沒有正在運行,它不會影響到訊息被發送到佇列,接收者在成功接收訊息之后需向佇列應答成功如果你希望發送的每個訊息都應該被成功處理的話,那么你需要P2P模型

Publisher/Subscriber (Pub/Sub) 模型

在Pub/Sub模型中包含如下概念:主題(Topic)、發布者(Publisher)、訂閱者(Subscriber),客戶端將訊息發送到主題,多個發布者將訊息發送到Topic,系統將這些訊息傳遞給多個訂閱者,

每個訊息可以有多個消費者,發布者和訂閱者之間有時間上的依賴性,針對某個主題(Topic)的訂閱者,它必須創建一個訂閱之后,才能消費發布者的訊息,而且,為了消費訊息,訂閱者必須保持運行的狀態,當然,為了緩和這種嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱,這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的訊息,如果你希望發送的訊息可以不被做任何處理、或者被一個消費者處理、或者可以被多個消費者處理的話,那么可以采用Pub/Sub模型,

何時使用訊息佇列

訊息佇列是軟體系統作資訊傳遞和系統集成的主要手段,同時相對于使用訊息佇列發送訊息而言,還有另外一種更加普遍使用的集成技術,就是API,兩者都具有廣泛的應用,所以在實際架構設計中,經常要考慮的問題是什么時候使用API,什么時候使用訊息佇列,下表列出兩者主要的區別:

特征

API訊息佇列

互動特性

HTTP是同步的,每個請求訊息都會有相應的反饋,從而實作了請求/回應機制,

訊息是異步的,實作發布/訂閱機制,在該機制下應用系統可以將訊息注冊到定義好的主題上,然后將訊息發布給所有的訂閱者,

應用呼叫

API 普遍存在,幾乎所有IT基礎設施都會支持HTTP訪問,并且大多數開發語言也會內置支持HTTP,

需要簡單的應用開發作業,訊息可以幫助你簡化避免訊息丟失的作業,使你能夠能加專注于業務,

耦合性

會有一點耦合,因為資訊流會直接從請求方發送到服務提供方,

完全解耦,訊息佇列扮演了一個臨時快取庫的角色,這樣即使接收訊息的應用或服務器崩潰了,或者過于繁忙無法處理請求,訊息可以在訊息佇列中等待知道服務方可以處理為止,

如何判斷什么時候該使用API,什么時候該使用訊息呢?舉個例子:

假設一個零售商開放他的產品清單,通過開放這個產品清單,合作廠商可以快速定位到自己的產品,產品清單中的資料是只讀的,所以用戶可以重復的請求訪問,這種場景下,REST API使用簡單并且同步,更適合這個場景,

另一個場景,假設一個醫院要在治療病人之后更新病人的病歷,病歷資訊對于醫院和病人來講都是非常關鍵的資訊,為了保證資訊在傳輸程序中不會丟失,此時采用訊息更加合適,

最后一個場景,假設一個零售商搭建一個應用允許合作廠商訪問他的產品清單并下訂單,這種情況下,可以同時使用API和訊息,在查詢產品清單時,可以使用API,而在下訂單時,為了避免訊息丟失和處理峰值流量,可以使用訊息佇列,

服務總線

訊息總線可以理解成全域的訊息通道,所以相對訊息佇列而言,他的不同之處在于全域性和共享性,所以,訊息總線會包含三部分:通用資料模型、通用指令集和訊息佇列,跟隨SOA(Service Oriented Architecture,面向服務架構)的概念,資訊系統的總線通常叫服務總線,企業層的總線稱之為企業服務總線(ESB),企業服務總線可以看作是一種模式,在這種模式下定義了一個集中式的訊息中間件實作各種后端系統的集成(包括資料模型轉換、連接、路由和編排),從而實作些集成服務可以在構建新應用時復用,

在SOA中,IT架構被分成組件層、Web服務層、業務流程層等,組件層包括各種應用系統,它們通常是技術相關的具體實作,各種具體的分布式組件技術(CORBA、COM/DCOM、J2EE)都可以用于實作組件層的應用組件,通常復雜的IT環境中的組件層都同時使用了多種分布式組件技術,而不同實作技術之間的互聯性障礙給應用集成帶來了極大的困難,進而形成了一個個資訊孤島,SOA引入了Web服務層來解決此種情況下的應用集成問題,Web服務是獨立于各種分布式組件技術的,它使用標準的基于XML的服務描述語言(Web Service Description Language,WSDL)來定義和封裝離散的業務功能,各種支持Web服務的分布式組件技術能夠將其上的業務組件發布成Web服務并產生相應的WSDL檔案,并且只需要依據WSDL描述的資訊就能夠呼叫Web服務,即WSDL所描述的業務功能,在SOA中,需要進入系統集成環節的業務組件都被映射為Web服務,形成了Web服務層,業務流程層則處于Web服務層之上,通過對Web服務的流程編排來實作商業流程,業務流程層通過Web服務層能夠呼叫到基于各種分布式組件技術實作的業務組件,實作了復雜IT系統環境的應用集成,

作為SOA基礎架構的關鍵部分,ESB的功能主要體現在通信、服務互動、應用集成、服務質量、安全性以及管理和監控等方面,在通信方面,ESB能夠支持訊息路由/尋址,支持多種通信技術、通信協議(如JMS、HTTP),支持發布/訂閱的通信模式,能夠處理請求/回應、同步以及異步的訊息傳遞方式,并且要求以可靠的方式傳遞訊息,

常見的ESB產品包括:IBM的WebSphere ESB,Microsoft 基于BizTalk的ESB產品,JBOSS SOA Platform等,

需要強調的是,訊息總線或企業服務總線的目的是為了系統集成和服務共享,因此,當使用訊息總線的時候,所有的服務或者應用必須共享相同的資料型別,指令集以及相同的通信協議,并且在訊息總線中,會最大量訊息轉換和編排的作業,而相對而言,訊息佇列的目的是資訊傳輸,因此并不限制是否型別一致,

流處理平臺——Kafka

市面上的訊息佇列產品有很多,比如ActiveMQ、RabbitMQ 、Kafka 、RocketMQ ,還有 ZeroMQ ,連 redis 這樣的 NoSQL 資料庫也支持 MQ 功能,但其中影響力最大的應該還是Kafka,而從Kafka給自己的定義可以看出,Kafka不只是訊息佇列,而是分布式的流處理平臺,

什么是流處理平臺呢?流處理是一種重要的大資料處理手段,其主要特點是其處理的資料是源源不斷且實時到來的,分布式流處理是一種面向動態資料的細粒度處理模式,基于分布式記憶體,對不斷產生的動態資料進行處理,其對資料處理的快速,高效,低延遲等特性,在大資料處理中發揮越來越重要的作用,流處理技術有很多技術選型,更多資訊可以參考“Apache 的流處理技術概述”,僅從Kafka的角度看流處理平臺和訊息佇列的區別,Kafka作為流處理平臺具有以下三種特性:

  1. 可以讓你發布和訂閱流式的記錄,這一方面與訊息佇列或者訊息總線類似,
  2. 可以儲存流式的記錄,并且有較好的容錯性,
  3. 可以在流式記錄產生時就進行處理,

但與基于佇列和交換的RabbitMQ不同,Kafka的存盤層是使用磁區的事務日志實作的,Kafka還提供用于實時處理流的Streams API和可輕松與各種資料源集成的Connector API,Kafka沒有“執行佇列”的概念,相反,Kafka將記錄的集合存盤在稱為主題(Topic)的類別中,對于每個主題,Kafka維護訊息的磁區日志,每個磁區都是一個有序的,不可變的記錄序列,在該記錄中連續附加訊息,因此Kafka的實作十分適合“Publisher/Subscriber (Pub/Sub) 模型”,但不適合“Point-to-Point(PTP)模型”,因此Kafka的定位并非訊息佇列或訊息總線,而是流處理平臺,

因此,流處理平臺和訊息佇列或訊息總線最大的區別就是在訊息佇列功能基礎上,流處理平臺更加關注對流資料分析的支持,

參考資料

  • https://www.gxlcms.com/redis-366754.html
  • https://blog.iron.io/top-10-uses-for-message-queue/
  • https://developer.ibm.com/articles/introduction-apis-and-messaging/
  • https://www.ibm.com/cloud/learn/esb
  • https://kafka.apachecn.org/
  • https://baike.baidu.com/item/%E4%BC%81%E4%B8%9A%E6%9C%8D%E5%8A%A1%E6%80%BB%E7%BA%BF/8790284?fr=aladdin
  • https://www.javatpoint.com/jms-tutorial
  • https://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%81%E5%A4%84%E7%90%86/22729451?fr=aladdin
  • https://blog.csdn.net/CSDN_bang/article/details/104454191?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267502.html

標籤:其他

上一篇:Redis筆記-1(Nosql、Redis基本概念)

下一篇:階段性學習總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more