发布订阅
發(fā)布訂閱
在軟件架構(gòu)中,發(fā)布訂閱是一種消息范式,消息的發(fā)送者(稱為發(fā)布者)不會(huì)將消息直接發(fā)送給特定的接收者(稱為訂閱者)。而是將發(fā)布的消息分為不同的類別,無需了解哪些訂閱者(如果有的話)可能存在。同樣的,訂閱者可以表達(dá)對(duì)一個(gè)或多個(gè)類別的興趣,只接收感興趣的消息,無需了解哪些發(fā)布者(如果有的話)存在。
發(fā)布/訂閱是消息隊(duì)列范式的兄弟,通常是更大的面向消息中間件系統(tǒng)的一部分。大多數(shù)消息系統(tǒng)在API中同時(shí)支持消息隊(duì)列模型和發(fā)布/訂閱模型,例如Java消息服務(wù)(JMS)。
這種模式提供了更大的網(wǎng)絡(luò)可擴(kuò)展性和更動(dòng)態(tài)的網(wǎng)絡(luò)拓?fù)?#xff0c;同時(shí)也降低了對(duì)發(fā)布者和發(fā)布數(shù)據(jù)的結(jié)構(gòu)修改的靈活性。
消息過濾
在發(fā)布/訂閱模型中,訂閱者通常接收所有發(fā)布的消息的一個(gè)子集。選擇接受和處理的消息的過程被稱作過濾。有兩種常用的過濾形式:基于主題的和基于內(nèi)容的。
在基于主題的系統(tǒng)中,消息被發(fā)布到主題或命名通道上。訂閱者將收到其訂閱的主題上的所有消息,并且所有訂閱同一主題的訂閱者將接收到同樣的消息。發(fā)布者負(fù)責(zé)定義訂閱者所訂閱的消息類別。
在基于內(nèi)容的系統(tǒng)中,訂閱者定義其感興趣的消息的條件,只有當(dāng)消息的屬性或內(nèi)容滿足訂閱者定義的條件時(shí),消息才會(huì)被投遞到該訂閱者。訂閱者需要負(fù)責(zé)對(duì)消息進(jìn)行分類。
一些系統(tǒng)支持兩者的混合:發(fā)布者發(fā)布消息到主題上,而訂閱者將基于內(nèi)容的訂閱注冊(cè)到一個(gè)或多個(gè)主題上。
拓?fù)?/strong>
在許多發(fā)布/訂閱系統(tǒng)中,發(fā)布者發(fā)布消息到一個(gè)中間的消息代理,然后訂閱者向該消息代理注冊(cè)訂閱,由消息代理來進(jìn)行過濾。消息代理通常執(zhí)行存儲(chǔ)轉(zhuǎn)發(fā)的功能將消息從發(fā)布者發(fā)送到訂閱者。
歷史
最早公開描述發(fā)布/訂閱系統(tǒng)之一的是Isis Toolkit的“新聞”子系統(tǒng),1987年,在計(jì)算機(jī)協(xié)會(huì)(ACM)的操作系統(tǒng)原理的研討會(huì)上,在論文《在分布式系統(tǒng)中利用虛同步》中。該文描述的發(fā)布/訂閱技術(shù)是由Frank Schmuck發(fā)明的。
優(yōu)點(diǎn)
松耦合
發(fā)布者與訂閱者松耦合,甚至不需要知道它們的存在。由于主題才是關(guān)注的焦點(diǎn),發(fā)布者和訂閱者可以對(duì)系統(tǒng)拓?fù)浣Y(jié)構(gòu)保持一無所知。各自繼續(xù)正常操作而無需顧及對(duì)方。在傳統(tǒng)的緊耦合的客戶端-服務(wù)器模式中,當(dāng)服務(wù)器進(jìn)程不運(yùn)行時(shí),客戶端無法發(fā)送消息給服務(wù)器,服務(wù)器也無法在客戶端不運(yùn)行時(shí)接收消息。許多發(fā)布/訂閱系統(tǒng)不但將發(fā)布者和訂閱者從位置上解耦,還從時(shí)間上解耦他們。中間件分析師對(duì)這種發(fā)布/訂閱使用的常用策略,是拆卸一個(gè)發(fā)布者來讓訂閱者處理完積壓的工作(帶寬限制的一種形式)。
可擴(kuò)展性
通過并行操作,消息緩存,基于樹或基于網(wǎng)絡(luò)的路由等技術(shù),發(fā)布/訂閱提供了比傳統(tǒng)的客戶端–服務(wù)器更好的可擴(kuò)展性。然而,在某些類型的緊耦合、高容量的企業(yè)環(huán)境中,隨著系統(tǒng)規(guī)模上升到由上千臺(tái)服務(wù)器組成的數(shù)據(jù)中心所共享的發(fā)布/訂閱基礎(chǔ)架構(gòu),現(xiàn)有的供應(yīng)商系統(tǒng)經(jīng)常失去這項(xiàng)好處;在這些高負(fù)載環(huán)境下,發(fā)布/訂閱產(chǎn)品的擴(kuò)展性是一個(gè)研究課題。
另一方面,在企業(yè)環(huán)境之外,發(fā)布/訂閱范式已經(jīng)證明了它的可擴(kuò)展性遠(yuǎn)超過一個(gè)單一的數(shù)據(jù)中心,通過網(wǎng)絡(luò)聚合協(xié)議如RSS和Atom提供互聯(lián)網(wǎng)范圍內(nèi)分發(fā)的消息。在交互時(shí),為了能夠即便是用低檔Web服務(wù)器也能將消息播出到(可能)數(shù)以百萬計(jì)的獨(dú)立用戶節(jié)點(diǎn),這些聚合協(xié)議接受更高的延遲和無保障交付。
缺點(diǎn)
發(fā)布/訂閱系統(tǒng)最嚴(yán)重的問題是其主要優(yōu)點(diǎn)的副作用:發(fā)布者解耦訂閱者。
消息交付問題:發(fā)布/訂閱系統(tǒng)必須仔細(xì)設(shè)計(jì),才能提供特定的應(yīng)用程序可能需要的更強(qiáng)大的系統(tǒng)性能,例如有保障的交付。
發(fā)布/訂閱系統(tǒng)的中介(broker)可能設(shè)計(jì)為在指定時(shí)間發(fā)送消息,隨后便停止嘗試發(fā)送,無論是否已收到所有用戶成功接收消息的確認(rèn)回復(fù)。這樣設(shè)計(jì)的發(fā)布/訂閱系統(tǒng)不能保證消息能夠傳遞到所有需要這種有保障交付的應(yīng)用程序。要達(dá)成有保障交付,必須在發(fā)布/訂閱架構(gòu)之外強(qiáng)制執(zhí)行這種發(fā)布者和訂閱者之間在設(shè)計(jì)上更緊密的耦合(例如,通過要求訂閱者宣布消息已接收)。
發(fā)布/訂閱系統(tǒng)中的發(fā)布者會(huì)“假定”訂閱者正在監(jiān)聽,而實(shí)際上可能沒有。一個(gè)工廠可能會(huì)使用發(fā)布/訂閱系統(tǒng)來允許設(shè)備發(fā)布問題和故障,訂閱者將問題顯示并記錄。如果記錄器失敗(崩潰了),那么設(shè)備故障發(fā)布者不一定收到記錄器失敗的通知,發(fā)布/訂閱系統(tǒng)的任何設(shè)備都不會(huì)顯示和記錄錯(cuò)誤消息。應(yīng)當(dāng)指出的是,對(duì)于其它消息架構(gòu)這也是一個(gè)設(shè)計(jì)上的挑戰(zhàn),例如客戶端/服務(wù)器系統(tǒng)。在客戶端/服務(wù)器系統(tǒng)中,當(dāng)一個(gè)錯(cuò)誤記錄器失效,系統(tǒng)將收到跡象。但是,客戶端/服務(wù)器系統(tǒng)要處理這個(gè)失效,就必須擁有一個(gè)在線的冗余日志服務(wù)器,或者動(dòng)態(tài)生成回退日志服務(wù)器。這就增加了服務(wù)端和客戶端以及整個(gè)客戶端/服務(wù)器架構(gòu)設(shè)計(jì)的復(fù)雜度。然而,發(fā)布/訂閱系統(tǒng)中,在不影響任何其它設(shè)備的情況下,精確復(fù)制現(xiàn)有日志器的冗余日志記錄訂閱者可以添加到系統(tǒng),來增加日志記錄的可靠性。在發(fā)布/訂閱系統(tǒng)中,有保障的錯(cuò)誤消息日志功能可以逐步添加,隨后實(shí)現(xiàn)設(shè)備故障信息記錄的簡(jiǎn)單基本功能。
在有少量發(fā)布者和訂閱節(jié)點(diǎn)的小型網(wǎng)絡(luò)和低信息量時(shí)發(fā)布/訂閱能夠自如伸縮。然而,隨著節(jié)點(diǎn)和消息量的增長,不穩(wěn)定性隨之增長,限制了發(fā)布/訂閱網(wǎng)絡(luò)的最大可擴(kuò)展性。大規(guī)模時(shí)吞吐量不穩(wěn)定的例子包括:
負(fù)載激增 - 訂閱請(qǐng)求使網(wǎng)絡(luò)流量飽和,隨后進(jìn)入低信息量(未充分利用網(wǎng)絡(luò)帶寬)
速度變慢 - 越來越多的應(yīng)用程序使用該系統(tǒng)(即使它們是在不同的發(fā)布/訂閱頻道通信)消息量流入單個(gè)訂閱者的速度緩慢
使用中介(服務(wù)器)的發(fā)布/訂閱系統(tǒng),同意中介發(fā)送消息給帶內(nèi)訂閱者,會(huì)引發(fā)安全問題。中介可能被愚弄,從而將通知發(fā)送給錯(cuò)誤的客戶端,增大了針對(duì)客戶端的服務(wù)請(qǐng)求被拒絕的可能性。中介本身可能超載,因?yàn)樗麄兎峙滟Y源來跟蹤創(chuàng)建的訂閱。
即使不依賴中介的系統(tǒng),訂閱者也可能可以接收未被授權(quán)的數(shù)據(jù)。未經(jīng)授權(quán)的發(fā)布者可能將不正確或損壞的消息引入到發(fā)布/訂閱系統(tǒng)。對(duì)于廣播或多播消息的系統(tǒng),這是尤其真實(shí)的。加密(例如傳輸層安全性協(xié)議(SSL/TLS)),可以防止未經(jīng)授權(quán)的訪問,但不能防止損壞的消息被授權(quán)的發(fā)布者引入。除了發(fā)布/訂閱架構(gòu),例如客戶端/服務(wù)器系統(tǒng),也經(jīng)常碰到授權(quán)的消息發(fā)送者有惡意行為。
總結(jié)
- 上一篇: threejs骨架形状
- 下一篇: PostgreSQL安装及关联ArcMa