自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

編譯 | 朱先忠

策劃 | Ethan

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

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

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

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

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

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

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

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

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

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

2、消息隊(duì)列

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

3、自定義解決方案

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

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

以分布式緩存作為消息傳遞平臺(tái)

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

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

圖片

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

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

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

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

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

圖片

圖2:NCache作為消息傳遞平臺(tái)

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

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

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

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

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

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

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

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

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

3、基本架構(gòu)

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

圖片

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

4、訂閱類(lèi)型

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

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

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

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

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

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

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

1、創(chuàng)建主題

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

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

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

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

2、發(fā)布消息

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

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

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

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

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

3、訂閱主題消息

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

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

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

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

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

4、注冊(cè)通知

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


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


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

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

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

總結(jié)    

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

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

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

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

譯者介紹

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

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

2015-08-10 22:36:41

收益寶

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2013-05-22 09:33:09

交互設(shè)計(jì)設(shè)計(jì)時(shí)間

2016-10-21 15:57:39

Rust編輯語(yǔ)言Fedora

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)

2023-11-10 09:22:06

2025-01-09 11:15:47

2017-05-16 14:38:25

2009-11-05 10:07:37

WCF設(shè)計(jì)模式

2013-11-08 09:15:32

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

2009-03-21 16:43:29

SOA虛擬化IT

2011-03-16 14:51:35

2016-10-21 09:45:20

RustFedoraJava

2017-09-11 13:55:30

前端JavaScript物聯(lián)網(wǎng)

2013-08-22 11:08:27

大數(shù)據(jù)商業(yè)只能Hadoop

2020-03-05 16:35:06

人臉識(shí)別口罩人工智能

2020-12-22 09:31:43

區(qū)塊鏈安全食品
點(diǎn)贊
收藏

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