Cribbb基於DDD/Domain Event領域事件的開源PHP通知系統
Cribbb是一個使用DDD聚合根和領域事件Domain Events概念開發的PHP開源通知框架:cribbb/cribbb · GitHub
幾乎所有Web應用都有一個通知提醒系統,這些通知系統都有共有的屬性和功能:
一個發往使用者的訊息管道
Cribbb通知系統扮演一種訊息管道,通知使用者最近的事件,有許多不同的“鉤子”可以觸發通知新增到使用者的訊息管道中。
一個訊息可以是任何型別
有許多不同的通知型別,針對應用中發生的不同的可能動作。
應當由可讀和未讀狀態
通知訊息應該有狀態,一旦使用者有開啟動作從而改變通知訊息的狀態,這是很重要的使用者介面設計。
傳送Email和作為UI一部分現實
預設情況使用者會收到一份Email,和使用者介面提醒一樣,使用者可以關閉郵件通知。
一個動作可以引起許多通知
在Cribbb中一個動作可以引起發給一個或多個使用者的通知,這意味著應當在動作和通知之間解耦。
通知訊息應該被佇列化
使用佇列系統傳送通知,因為針對一個動作可能有大量Email傳送,通知傳送不必即時。
通知是傳送給使用者的一個訊息,告訴他們他們對應用中感興趣的事件發生了,也許是一個使用者follow了他,或回覆了他的帖子。
Domain Events是易於針對應用中事件的發生實現相應的通知機制的,當一個領域事件傳送時,註冊的監聽器類將自動引爆,這樣動作和事件實現解耦,我們可以根本無需接觸事件的觸發動作而新增事件的監聽器。
幾乎所有Web應用都有一個通知提醒系統,這些通知系統都有共有的屬性和功能:
一個發往使用者的訊息管道
Cribbb通知系統扮演一種訊息管道,通知使用者最近的事件,有許多不同的“鉤子”可以觸發通知新增到使用者的訊息管道中。
一個訊息可以是任何型別
有許多不同的通知型別,針對應用中發生的不同的可能動作。
應當由可讀和未讀狀態
通知訊息應該有狀態,一旦使用者有開啟動作從而改變通知訊息的狀態,這是很重要的使用者介面設計。
傳送Email和作為UI一部分現實
預設情況使用者會收到一份Email,和使用者介面提醒一樣,使用者可以關閉郵件通知。
一個動作可以引起許多通知
在Cribbb中一個動作可以引起發給一個或多個使用者的通知,這意味著應當在動作和通知之間解耦。
通知訊息應該被佇列化
使用佇列系統傳送通知,因為針對一個動作可能有大量Email傳送,通知傳送不必即時。
通知是傳送給使用者的一個訊息,告訴他們他們對應用中感興趣的事件發生了,也許是一個使用者follow了他,或回覆了他的帖子。
Domain Events是易於針對應用中事件的發生實現相應的通知機制的,當一個領域事件傳送時,註冊的監聽器類將自動引爆,這樣動作和事件實現解耦,我們可以根本無需接觸事件的觸發動作而新增事件的監聽器。
有界上下文
經過幾周發現了區分不同的限定上下文Bounded Conext 重要性,一個有界的上下文是作為保護維護統一內部模型的層出現,這對於大型應用很重要。
Cribbb有一個身份方面的有界上下文,功能有:包括註冊一個新使用者 following其他使用者,更新賬戶資訊等。
那麼通知功能是否有自己的有界上下文?或者是身份有界上下文的一部分?
通知功能其實應該屬於身份有界上下文:
首先,通知是使用者身份系統的一種重要概念,應用可以觸發一個通知,但是通知僅僅對於註冊有身份的使用者是重要的。
其次,在通知模型和使用者身份識別模型之間沒有矛盾,如果有,那麼我們可能就區分為不同的有界上下文。
最後,一個通知沒有道理不和使用者繫結,一個使用者只能檢視自己的通知,不能看其他使用者的通知,我們為Cribbb建立一個獲得通知的API,端點是:me/notifications.
通知實體和使用者聚合
通知應該作為實體建模,通常你預設會建立為值物件 而不是實體,因為簡單,但是這次我們沒有選擇。
通知沒有必要知道使用者上下文以外的事情,我們應當能夠從資料庫任意地接受訊息,而不是隻能從User物件獲得一個使用者的通知。
這意味著通知如果放在User聚合中很整潔合適。Notification通知實體也能非常簡單。
首先,通知需要一個內容體需要儲存通知的內容文字資料。
其次,我們需要一個 已讀/未讀的狀態,我們需要通知訊息被讀的時間戳,這樣我們能夠判斷這兩個狀態。
最後,我們分類通知以便可以過濾它們,在通知實體中使用一個關鍵詞來標識。
相關文章
- DDD領域驅動設計:領域事件事件
- 基於阿里開源的COLA架構和DDD領域驅動設計構建貨物運輸系統阿里架構
- 基於DDD領域建模思想、COLA開源架構和CQRS模式設計和構建貨物運輸系統架構模式
- 關於聚合根,領域事件的那點事---深入淺出理解DDD事件
- 領域驅動模型DDD(二)——領域事件的訂閱/釋出實踐模型事件
- 基於工業領域的UWB定位系統原始碼原始碼
- 不同於DDD有界上下文:SAP One Domain統一領域模型試圖成為整合智慧套件的通用語言 | SAP BlogsAI模型套件
- DDD-領域物件與領域服務物件
- 領域驅動設計的DDD與ddd - nick
- 開源線上客服系統(支援H5的線上客服系統原始碼基於PHP)H5原始碼PHP
- 運用領域模型——DDD模型
- DDD之2領域概念
- 基於COLA架構建立運輸微服務應用和DDD領域建模架構微服務
- 基於Django 的 FreeSwitch 開源GUI 管理系統 YouPBXDjangoGUI
- DDD劃分領域、子域,核心域,支撐域的目的
- liiklus:基於事件的Reactive(RSocket/gRPC)系統事件ReactRPC
- 在DDD中建立領域模型模型
- DDD領域設計概念梳理
- OnionArch 2.0 - 基於DDD的洋蔥架構改進版開源架構
- SpringBoot+Dubbo+DDD領域驅動設計開源專案:myddd-spring-bootSpring Boot
- GitHub - knative/eventing-contrib: 基於knative的Event Sources事件溯源Github事件
- 使用Spring Data JPA在更改實體時釋出DDD領域事件 - thorbenSpring事件ORB
- 領域驅動設計(DDD)實踐之路(二):事件驅動與CQRS事件
- 領域本體與DDD的UL語言
- DDD領域驅動設計pdf
- JavaScript基礎之事件eventJavaScript事件
- 什麼是DDD領域驅動設計的統一語言?
- ravynOS 0.5.1 - 基於 FreeBSD 的 macOS 相容開源作業系統Mac作業系統
- 基於Raft的分散式MySQL Binlog儲存系統開源Raft分散式MySql
- ddd-crew/core-domain-charts:幫助查詢DDD核心子域的複雜性分析工具集AI
- 領域驅動設計:CQRS 和事件源的強大功能事件
- 知識付費系統原始碼基於PHP開源的網站內容付費原始碼原始碼PHP網站
- ABP與DDD領域驅動關係
- DDD-領域驅動設計示例
- 淺談DDD(領域驅動設計)
- 淺談 DDD 領域驅動設計
- DDD學習(二)—— 領域建模重要概念
- DDD+Javascript領域建模示例 -Alex LawrenceJavaScript
- DDD領域驅動設計:倉儲