ABP學習實踐 九 使用CAP整合訊息佇列

2021-10-02 12:08:54 字數 1987 閱讀 5396

領域事件可以觸發應用內領域物件變化的通知,結合實時訊息(例如signalr)可以將通知推送給外部應用。但是訊息推送的可靠性如何保證?abp框架能整合訊息佇列嗎?當然可以,下面就是示例。

實時資料傳輸和訊息佇列是兩類不同的技術方案,有著不同的應用場景,但又有一定的相似性。實時資料傳輸更偏重於「實時」兩個字,要求保證資料的及時有效交換,多用於多**相關的業務場景,常見的技術棧有webrtc、signalr等;訊息佇列更偏重於「可靠」,多用於能夠容忍一定延遲但要求資料可靠到達的業務場景,常見的技術棧有activemq、rabbitmq、kafka等。相似的地方是,實時資料傳輸與訊息佇列基本都有諸如分布式、高併發之類的解決方案,而且常用的也都是訂閱/發布模式。訂閱/發布模式也並不是實時資料傳輸或訊息佇列的專利,很多開發語言、技術棧都有這樣的機制,這樣的機制也更有利於我們快速使用擁有訂閱/發布模式的技術棧。

簡單談了下我對實時資料傳輸和訊息佇列的淺薄理解,回到本篇的主題–在abp框架中整合訊息佇列。abp官方似乎並沒有提供單獨的整合訊息佇列的開發包,redis可以承擔訊息佇列的功能,但是其他幾種訊息佇列怎麼辦?倒是可以根據abp框架的介面實現常見幾種訊息佇列的模組。但是懶人就想問:有沒有現成的?當然有,下面就安利下開源框架dotnetcore/cap。

cap開源專案-github

public

class

startup);

}); #endregion

//...

}//...

}

/// 

/// 資料訂閱服務

///

public

class

}public

inte***ce

:icapsubscribe

另外不要忘了在web專案的startup啟動類中註冊資料訂閱服務。()

;

/// 

/// 貨品管理-應用服務

///

public

class

public override task

create

(creategoodsdto input)

}

可能寫到這裡還沒說清楚上面一堆**要幹什麼。簡單來說,現在很多的分布式應用都存在分庫或分應用的場景。還是以之前的貨品管理為例,假設貨品管理的應用程式連線資料庫且需要資料同步,也就是主應用的資料變化時需要將資料同步到其他應用。上面一系列的**描述的就是這一過程:應用連線mysql資料庫,通過api介面新增貨品時,將新增貨品的資料發布到應用所連線的訊息佇列rabbitmq中,對應的是goods-sync這個主題,訂閱了對應主題的應用接收到推送的新增貨品資料後繼續進行後續操作。

services.

addcap

(x =

>

);

啟動專案後,開啟位址http://***x:xx/cap就能訪問ui介面了。

通過上面的例子粗略說明了cap能幹什麼,再來說說cap是什麼。先看一張官方給出的示意圖。

根據官方的描述,cap是乙個分布式事務解決方案,能夠在分布式系統中(soa,microservice)實現事件匯流排及最終一致性,基於 .net core 技術,具有輕量級、易用性、高效能等特點。我個人是把cap理解為一座橋梁,一座能夠連線資料庫、訊息佇列、應用的橋梁和中轉站。

目前dotnetcore.cap在資料庫方面支援sql server、mysql、postgresql、mongodb等,在訊息佇列方面支援kafka、rabbitmq、azureservice等,實用性很強,再次安利。

源**示例-github

ABP學習實踐 七 領域事件

事件是在軟體開發過程中經常用到的一種思路和形式,事件常常是和觀察者模式 訂閱發布這樣的詞彙聯絡在一起。在abp框架中同樣也少不了事件,也就是領域事件。在具體業務中常常會有這樣的需求,以前面的貨品管理功能為例,對於某種特定型別的貨品,我們希望在貨品庫存數量低於某個特定值的時候得到提醒,以便於進行採購 ...

ABP理論學習之NHibernate整合

返回總目錄 倉儲 閱讀其他 abp可以使用任何orm框架工作,並且已經內建了nhibernate整合。這篇文章會解釋如何在abp中使用nhibernate。閱讀本文的前提是假設你已經熟悉了ef的基本知識。在abp中使用nh作為orm的nuget包是abp.nhibernate。你應該將它新增到應用程...

ABP理論學習之Swagger UI整合

返回總目錄 將swagger整合到基於abp的應用中是很容易的事情。安裝nuget包 將swashbuckle.core nuget包安裝到webapi專案 或web專案 中。配置將swagger的配置 新增到模組的initialize方法中。例如 public class swaggerinteg...