偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

當(dāng)發(fā)布/訂閱模式遇上.NET

譯文 精選
開發(fā)
如何應(yīng)對這種復(fù)雜多變的分布式事件,一直是件相當(dāng)棘手的問題。而這正是發(fā)布-訂閱設(shè)計模式的用武之地。

編譯 | 朱先忠

策劃 | Ethan

日常開發(fā)中,我們通常會在同一個體系架構(gòu)中部署了多個不同角色的應(yīng)用程序,而這些應(yīng)用程序需要某種機制來通知彼此發(fā)生了哪些事件。這些事件可能是臨時的(在運行時臨時所做的更改),也可能是數(shù)據(jù)庫事件(由于數(shù)據(jù)庫中的更改)。如何應(yīng)對這種復(fù)雜多變的分布式事件,一直是件相當(dāng)棘手的問題。而這正是發(fā)布-訂閱設(shè)計模式的用武之地。

眾所周知,發(fā)布-訂閱模式在眾多設(shè)計模式中,可能是最常見、最有名的一個了。它定義了一種一對多的關(guān)系,讓多個訂閱者對象同時監(jiān)聽某一個主題對象,當(dāng)這個主題對象的狀態(tài)發(fā)生變化時就會通知所有訂閱自己的訂閱者對象,使得他們能夠自動更新自己。

在“發(fā)布-訂閱”的消息傳遞范式中,消息的發(fā)送者(發(fā)布者)并不知道預(yù)期的收件人(訂閱者)。此外,發(fā)布者和訂閱者應(yīng)用程序之間并不直接交互,而是依賴于稱為“主題”的公共媒體。因此,發(fā)布-訂閱模式是一個松散耦合的消息傳遞cdxxd模型。

正是基于這些特性,發(fā)布-訂閱模式(簡稱為“發(fā)布/訂閱”)成為了構(gòu)建企業(yè)級.NET應(yīng)用程序不可或缺的工具。

分布式事件驅(qū)動架構(gòu)探索

為了設(shè)計分布式事件驅(qū)動體系架構(gòu),開發(fā)人員以往傾向于采用以下方案之一。

1、RDBMS提供數(shù)據(jù)通知

如果數(shù)據(jù)存儲僅限于關(guān)系數(shù)據(jù)庫,數(shù)據(jù)庫通知功能的確可以做到。除了允許向數(shù)據(jù)庫服務(wù)器注冊事件外,該功能還會在數(shù)據(jù)庫結(jié)果集因更新、添加或刪除而發(fā)生更改時,通知到應(yīng)用程序側(cè)。

但這里有一個問題,RDBMS本質(zhì)上是不可擴展的,很容易成為應(yīng)用程序的性能瓶頸。典型情況下,開發(fā)者不想讓數(shù)據(jù)庫承擔(dān)不必要的額外任務(wù)。此外,數(shù)據(jù)庫通知功能本身速度也較慢,而且不支持運行時數(shù)據(jù)共享。

這就不難理解,將數(shù)據(jù)庫用作消息傳遞介質(zhì)并不是最佳設(shè)計選擇。

2、消息隊列

另一種選擇是在體系架構(gòu)中引入單獨的消息隊列。雖然這些消息隊列在幫助您在應(yīng)用程序之間傳輸消息方面做得很好,但這些隊列并不是以數(shù)據(jù)為中心的,即它們不監(jiān)視數(shù)據(jù)庫或任何其他源中的數(shù)據(jù)更改。此外,這些消息隊列無法與應(yīng)用層一起擴展。

3、自定義解決方案

剩下的最后一個選擇是,打造適合自己需要的消息平臺。定制解決方案這個想法乍一看很誘人,但是在所需的時間和資源方面都可能難以預(yù)估,因為構(gòu)建和管理一個健壯且可擴展的消息傳遞平臺是一項非常艱巨的任務(wù)。

問題癥結(jié)在于:究竟哪種解決方案更易于合并、可擴展、高可用且非常可靠??

以分布式緩存作為消息傳遞平臺

這里分享一種使用分布式緩存消息傳遞平臺NCache。事實證明,這不僅是一個簡單可行的解決辦法,而且也是整合健壯消息傳遞平臺的一種更現(xiàn)代化的方法。NCache是目前市場上提供的唯一真正的本地.NET/.NET內(nèi)核分布式緩存。它是一種內(nèi)存中的分布式緩存技術(shù),速度極快,可擴展性極強。它使應(yīng)用程序能夠處理極端的事務(wù)負(fù)載,而不會使數(shù)據(jù)庫成為瓶頸。此外,您還可以使用NCache以實時方式來處理數(shù)據(jù)/流。

NCache通常部署在N層體系架構(gòu)的中間層。下圖給出其所在架構(gòu)層次的更直觀的展示。

圖片

圖1:N層體系架構(gòu)中部署的NCache

NCache是一個緩存服務(wù)器集群,能夠每秒為.NET應(yīng)用以及Java應(yīng)用提供數(shù)萬個請求——通過將經(jīng)常使用的數(shù)據(jù)保存在內(nèi)存中,從而有效避免大量的數(shù)據(jù)庫訪問。

下面,深入分析一下NCache。首先,讓我們看看NCache作為事件驅(qū)動體系架構(gòu)的消息總線的原理。

1、NCache事件驅(qū)動消息

下圖顯示了NCache是如何作為.NET和Java應(yīng)用程序的消息總線功能的。

圖片

圖2:NCache作為消息傳遞平臺

在上圖架構(gòu)中,NCache通過使用快速緊湊序列化來實現(xiàn)跨平臺通信,該序列化可以轉(zhuǎn)換.NET或Java對象轉(zhuǎn)換為二進制文件,然后將它們傳輸?shù)骄彺婕?。所以,這就給出了NCache如何支持.NET應(yīng)用程序與Java應(yīng)用程序進行交互的內(nèi)在邏輯。有關(guān)這方面更多信息,請自行搜索查看可移植的數(shù)據(jù)類型相關(guān)內(nèi)容。

NCache以事件的名稱管理發(fā)布/訂閱設(shè)計模式,并提供不同的方法將消息傳播到其他偵聽?wèi)?yīng)用程序。讓我們看看這兩種消息類型,從而了解分布式緩存是如何傳播它們的。

首先,考慮應(yīng)用程序需要偵聽的數(shù)據(jù)變化。因為NCache也是使用.NET鍵值存儲技術(shù),它提供在緩存中發(fā)生任何數(shù)據(jù)變化時更新應(yīng)用程序的功能。因為所有這些都發(fā)生在內(nèi)存中,所以不存在性能瓶頸問題。這些數(shù)據(jù)變化可以是:

  • 緩存級項目變化,無論是更新還是刪除
  • 整個緩存級數(shù)據(jù)變化
  • 連續(xù)查詢,您可以在其中注冊一個類似SQL的查詢,以監(jiān)視結(jié)果集是否在緩存中更改。如果確實如此,則會通知應(yīng)用程序
  • 如果由于任何新節(jié)點添加或刪除或崩潰導(dǎo)致的集群發(fā)生更改。(對于管理方面來說)

NCache還允許數(shù)據(jù)庫的依賴關(guān)系注冊,包括SQL、Oracle和OleDb等。這有助于使數(shù)據(jù)庫以及應(yīng)用程序的緩存數(shù)據(jù)保持最新。有關(guān)支持的依賴關(guān)系類型的完整列表,請檢查數(shù)據(jù)庫依賴關(guān)系內(nèi)容,在此不再贅述。這些依賴項是在不同的數(shù)據(jù)存儲中注冊的數(shù)據(jù)變化通知;但是,可以讓NCache處理它。您還可以將數(shù)據(jù)庫通知與NCache數(shù)據(jù)通知相結(jié)合,以便進一步豐富項目構(gòu)建策略。

另一方面,如果您只想將簡單消息傳播到復(fù)雜的.NET或Java對象,那么你應(yīng)該使用自定義消息傳遞功能。在這里,一個應(yīng)用程序可以生成數(shù)據(jù)并觸發(fā)事件,而感興趣的偵聽器幾乎會在瞬間接收到事件。有關(guān)這方面的更多信息,讀者可以自行查看自定義事件相關(guān)的文章。

2、NCache發(fā)布/訂閱API

NCache提供了內(nèi)存發(fā)布者/訂閱者(發(fā)布/訂閱)功能和專用的發(fā)布/訂閱消息存儲,以支持.NET Web應(yīng)用程序中的實時信息共享,最終幫助應(yīng)用程序更好地通信。

發(fā)布/訂閱模式通過提供一個由感興趣的用戶發(fā)布和訂閱消息的渠道,自然地將發(fā)布者和訂閱者解耦。現(xiàn)在,當(dāng)NCache充當(dāng)消息傳遞總線時,發(fā)布/訂閱模型受益于底層NCache分布式體系架構(gòu)和許多方便的功能。

3、基本架構(gòu)

先來了解一下NCache發(fā)布/訂閱的基本組件及其工作原理。NCache發(fā)布/訂閱消息的一般流程如下:首先,由發(fā)布者使用ITopic接口發(fā)布主題消息。接下來,訂閱者可以創(chuàng)建對一個或多個主題的訂閱,并接收相關(guān)消息。成功傳遞消息后,NCache將收到確認(rèn);否則,NCache將在消息過期之前繼續(xù)重試(如果設(shè)置了過期信息)。未送達(dá)的消息將駐留在緩存中,直到過期消息被觸發(fā),請參考下圖示意。

圖片

圖3:NCache發(fā)布/訂閱消息機制

4、訂閱類型

NCache為發(fā)布/訂閱消息提供了兩種不同類型的訂閱,即非持久訂閱和持久訂閱。此外,NCache支持獨占和共享訂閱策略。下文將討論相關(guān)細(xì)節(jié)。

  • 非持久訂閱:默認(rèn)情況下,在主題上創(chuàng)建的所有訂閱都是非持久訂閱。它僅在保持連接之前將預(yù)期消息傳送給訂閱者。如果訂閱者的連接因任何原因而丟失,則不會在重新加入網(wǎng)絡(luò)時收到舊消息。這種類型的訂閱是獨占的,這意味著一個訂閱僅屬于一個訂閱者
  • 持久訂閱:它考慮了訂閱者斷開連接時的消息丟失。NCache在連接丟失時保留訂閱者的訂閱。因此,訂閱者可以在重新連接時接收其所發(fā)布的感興趣的消息

持久訂閱提供了兩種策略:

  • 獨占式:一次一個訂閱僅屬于一個活動的訂閱方
  • 共享式:一個訂閱可以同時注冊多個訂閱者,并提供負(fù)載共享

NCahce發(fā)布/訂閱應(yīng)用案例

假設(shè)有一家電子商務(wù)商店,不同供應(yīng)商定期向該商店提供新產(chǎn)品。同時,還提供產(chǎn)品的銷售和優(yōu)惠。對所提供產(chǎn)品感興趣的門店經(jīng)理和客戶需要隨時了解新產(chǎn)品、待售產(chǎn)品和折扣的最新情況。NCache發(fā)布/訂閱功能可以在此場景中啟用分布式通知系統(tǒng)。為此,可以首先創(chuàng)建NCache專用的發(fā)布/訂閱消息存儲。

接下來,讓我們討論一下在上述場景中通過使用NCache發(fā)布/訂閱消息API實現(xiàn)分布式消息的逐步過程。

1、創(chuàng)建主題

作為第一步,需要創(chuàng)建一個主題,以便不同供應(yīng)商可以發(fā)布新產(chǎn)品的更新??梢允褂肗Cache中的ITopic接口創(chuàng)建一個具有唯一名稱的新主題。下面的代碼展示了發(fā)布方應(yīng)用程序如何使用方法CreateTopic來創(chuàng)建一個名為newProducts的主題。

//前提條件:緩存已連接
//指定主題名稱
string topicName = “newProducts”
//創(chuàng)建主題
ITopic topic = cache.MessagingService.CreateTopic(topicName);

如果已經(jīng)存在具有所提供名稱的主題,則該主題的實例將作為ITopic返回。

NCache允許在創(chuàng)建主題時設(shè)置主題優(yōu)先級。當(dāng)某些事件需要以比其他事件更高的優(yōu)先級進行溝通時,這很有用。例如,有關(guān)制成品的信息就是很緊急的;同樣,由于折扣或銷售導(dǎo)致的產(chǎn)品價格更新對于賣方/買方來說也是最重要的。在這種情況下,可以在創(chuàng)建主題時將主題優(yōu)先級設(shè)置為高,并且可以毫不延遲地接收相關(guān)通知。

2、發(fā)布消息

創(chuàng)建主題后,發(fā)布方應(yīng)用程序可以使用Publish方法將相關(guān)消息發(fā)布到該主題。為此,首先通過指定主題名稱來獲取主題的實例。NCache在發(fā)布消息時提供以下兩種傳遞模式:

  • All(默認(rèn)):將消息傳遞給所有注冊訂閱者。當(dāng)需要廣播信息時,這很有用。
  • Any:將消息傳遞給任何注冊訂閱者。

此外,為了有效地管理你的發(fā)布/訂閱緩存的存儲空間,你還可以設(shè)置消息的過期時間。

在以下代碼中,發(fā)布者將在現(xiàn)有主題newProducts上廣播有關(guān)新產(chǎn)品的消息。

//前提條件:緩存已連接
//主題“newProducts”已創(chuàng)建
string topicName = "newProducts"
//獲取主題
ITopic productTopic = cache.MessagingService.GetTopic(topicName);
//創(chuàng)建要在消息中發(fā)送的對象
Product product = FetchProductFromDB(10248);
//創(chuàng)建相應(yīng)于對象順序的新消息

3、訂閱主題消息

創(chuàng)建主題后,訂閱者應(yīng)用程序可以通過獲得訂閱來接收發(fā)布到該主題的消息。由于支持不同類型的訂閱,因此對非持久訂閱感興趣的訂閱者可以使用CreateSubscription方法;對于持久訂閱,則可以使用CreateDurableSubscription方法。

下面的代碼顯示訂閱者應(yīng)用程序如何為主題newProducts創(chuàng)建訂閱。MessageReceived注冊回調(diào)以在收到通知時執(zhí)行任何預(yù)期操作。例如,訂閱者可以在收到銷售通知時在MessageReceived回調(diào)中更新產(chǎn)品價格。

//前提條件:緩存已連接
//主題“newProducts”已創(chuàng)建
string topicName = "newProducts"
//獲取主題
ITopic productTopic = cache.MessagingService.GetTopic(topicName);
//創(chuàng)建并注冊主題newProducts的訂閱者
//指定回調(diào)函數(shù)MessageReceived
ITopicSubscription orderSubscriber = orderTopic.CreateSubscription(MessageReceived);

在上面的示例中,創(chuàng)建了一個非持久訂閱。此外,當(dāng)需要在重新連接時從訂閱的主題接收舊消息時,訂閱者可以創(chuàng)建持久訂閱。

NCache還提供了一種基于模式的訂閱方法,其中NCache支持多個通配符來訂閱所提供模式下的單個/多個主題。

4、注冊通知

NCache使發(fā)布者能夠了解消息的狀態(tài)和主題的可用性。發(fā)布者應(yīng)用程序可以注冊以下通知:


  • MessageDeliveryFailure:如果消息因任何問題而無法傳遞,則通知發(fā)布者
  • OnTopicDeleted:當(dāng)消息被刪除時通知發(fā)布者


以下是發(fā)布者注冊這兩種通知的簡單方式:

//您有一個現(xiàn)有主題的實例productTopic
//注冊消息傳遞失敗
productTopic.MessageDeliveryFailure += OnFailureMessageReceived;
//注冊主題刪除通知
productTopic.OnTopicDeleted = TopicDeleted;

通過遵循上述步驟,可以將基本的發(fā)布/訂閱消息體系架構(gòu)集成到任何一款A(yù)SP.NET或者.NET核心應(yīng)用程序中。

總結(jié)    

至此,總結(jié)一下NCache發(fā)布/訂閱模式為克服現(xiàn)有解決方案中存在的局限性提供了哪些好處。

  • 由于具有線性可擴展性,NCache發(fā)布/訂閱可以通過添加緩存服務(wù)器和頻繁地執(zhí)行負(fù)載平衡來處理越來越多的訂閱請求。該伸縮特征對用戶透明,而且不會妨礙通信過程。因此,您可以使用NCache發(fā)布/訂閱模式來輕松擴展通信性能。
  • NCache發(fā)布/訂閱有助于持久訂閱、消息傳遞失效和傳遞失敗通知,以避免消息丟失。此外,NCache的分布式和復(fù)制體系架構(gòu)確保了NCache的高可用性,以適應(yīng)動態(tài)環(huán)境中訂閱者的連接。所有這些功能確保了可靠的通信。
  • 由于NCache是內(nèi)存中的分布式緩存,因此駐留在緩存中的消息存儲本身就很快。此外,NCache允許對駐留在緩存中的數(shù)據(jù)項指定是否過期,以便智能地管理存儲空間。

NCache的可擴展性、可靠性和存儲效率,以及發(fā)布/訂閱的松耦合和異步消息傳遞模式,使得NCache發(fā)布/訂閱功能在未來的.NET/NET核心應(yīng)用程序分布式消息傳遞開發(fā)中極具前景。

原文鏈接:https://dzone.com/articles/pubsub-design-pattern-in-net-distributed-cache

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。早期專注各種微軟技術(shù)(編著成ASP.NET AJX、Cocos 2d-X相關(guān)三本技術(shù)圖書),近十多年投身于開源世界(熟悉流行全棧Web開發(fā)技術(shù)),了解基于OneNet/AliOS+Arduino/ESP32/樹莓派等物聯(lián)網(wǎng)開發(fā)技術(shù)與Scala+Hadoop+Spark+Flink等大數(shù)據(jù)開發(fā)技術(shù)。

責(zé)任編輯:薛彥澤 來源: 51CTO
相關(guān)推薦

2015-08-10 22:36:41

收益寶

2013-05-22 09:33:09

交互設(shè)計設(shè)計時間

2016-10-21 15:57:39

Rust編輯語言Fedora

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2017-06-28 11:34:55

銳捷 醫(yī)療 物聯(lián)網(wǎng)

2022-12-02 07:28:58

Event訂閱模式Spring

2015-01-07 15:49:21

大數(shù)據(jù)SSD

2017-08-18 14:47:31

DDD微服務(wù)架構(gòu)

2025-09-04 07:52:16

2025-05-20 08:22:31

Gson內(nèi)核設(shè)計模式

2017-05-16 14:38:25

2025-01-09 11:15:47

2023-11-10 09:22:06

2009-11-05 10:07:37

WCF設(shè)計模式

2013-11-08 09:15:32

大數(shù)據(jù)平板電腦

2016-10-21 09:45:20

RustFedoraJava

2009-03-21 16:43:29

SOA虛擬化IT

2011-03-16 14:51:35

2025-08-07 08:35:06

2013-08-22 11:08:27

大數(shù)據(jù)商業(yè)只能Hadoop
點贊
收藏

51CTO技術(shù)棧公眾號