情況為了更好地理解 CQRS、事件溯源和異步服務通信的概念,我一直在使用 Go、MongoDB 和 RabbitMQ 構建一個小型系統。這包括以下內容:命令 API:公開一個 API 以接受和處理命令,然后將事件寫入 MongoDB 集合(稱為“事件”)事件發布者:監視“事件”集合的更改并將其發布到 RabbitMQ事件消費者:從 RabbitMQ 接收事件并使用它們來更新讀取優化的 MongoDB 集合查詢 API:公開一個 API 以從物化集合返回數據(我設想為系統中的每個微服務重復一組類似的應用程序,所有這些應用程序都通過 RabbitMQ 異步通信)問題我覺得我在高層次上對這些概念有了不錯的掌握,但是在構建這個系統時,我在細節上遇到了一些麻煩。我發現我需要:使用 BSON 作為 RabbitMQ 有效負載,使事件發布者的事情變得“簡單”——這感覺就像 MongoDB 正在泄漏到設計的其余部分,因為否則我不會選擇 BSON讓事件發布者知道所有事件類型,以便它可以正確地將存儲的事件從 BSON 轉換為 JSON(例如,將日期和 UUID 重寫為字符串)以發布到消息總線 - 這似乎很臭,因為各種事件類型都需要在不少于三個不同的地方(命令端、查詢端和事件發布者)定義。問題對于使用 CQRS + 事件溯源 + 消息總線的設計來說,這種類型的問題是正常發生的,還是我的方法存在根本缺陷?如果這是課程的標準,那么以上兩個選項中的哪一個更適合在生產環境中使用?我的搜索沒有發現任何關于這個問題的信息,但如果你知道一篇文章或博客文章解決了這個問題,那可能就足夠了。
1 回答

HUX布斯
TA貢獻1876條經驗 獲得超6個贊
有事件升級器的概念。事件升級器的目的是在發布事件之前(也在聚合水合之前)將來自事件存儲的事件作為非類型化數據結構轉換為類型化數據結構。這些通常用于版本控制。請記住,系統發展得越多,您的事件類型發生變化的機會就越多,因此您將無法僅從 json/bson 反序列化。
一旦你正確輸入了事件,就在 json 中將它們序列化,以將它們傳遞到總線并在另一端反序列化它們。
事件類型需要在不少于三個不同的地方定義(命令端、查詢端和事件發布者)
只需在共享庫中定義您的事件類型。
此外,它不相關,但你真的不需要公共汽車。當涉及到重建投影時,它們會導致更多問題,因為它們不會跟蹤上次讀取事件。Greg Young 在 YouTube 的某個地方談到了它(應該不難找到)。
- 1 回答
- 0 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消