先介紹一下背景 ?
團隊正在乙個為 sql server 構建資料目錄專案的歷程中,我們優化系統以實現解耦。這對我們來說非常重要,從根本上來說,我歸結為兩個核心原則,希望每個軟體專業人員都能認同:
對持久化有何影響??
考慮到前面總體原則,我們不想把自己的狀態持久化耦合到乙個特定的資料庫引擎上。從實際情況來看,就是說不將持久化的具體關注點傳遞到領域層。之所以要實現這一點,因為我們今天對規則的認知可能會讓我們依賴某種具體資料庫技術,比如 sql server,但並不能確保它能滿足未來的能力需求。
有了這個具體的要求,持久化就需要出現在域事件而不是儲存系統中,這也導致不同的儲存需求。
幸運的是,有一些廣為人知的、經過實戰檢驗的模式可以解決這個問題,如結合 cqrs 領域驅動設計中的聚合設計等。因此這裡的假設是,實現理想狀態對我們來說是低成本的。
**生成 id 還是資料庫生成 id ?
許多資料儲存系統(如 sql server)都具備為每條記錄(如行、文件等)生成唯一識別符號的方法。當將新記錄插入表中時,使用自動增量鍵可以生成唯一編號。當我們要插入一條新記錄時,資料庫引擎就自動完成自增主鍵,並且可以確保該鍵對於表是唯一的。
但是如果依賴資料庫來為我們業務域生成唯一識別符號,這將讓業務層與資料儲存系統耦合在一起。如果我們想切換乙個不支援生成自動增量主鍵的資料儲存系統,那就不能簡單更換。而且,每個資料儲存系統生成識別符號的方式都不一樣,這可能會導致我們最終使用不同的主鍵型別。除此之外,這些型別的生成方式可能不適合分布式系統。例如,當我們在 sql server 資料庫中擁有乙個生成主鍵的表時,我們沒有乙個簡單的方法在分布式環境中水平擴充套件這個表。
通過讓業務域的消費者(即通過命令和查詢與域通訊的傳輸層)負責唯一鍵的識別符號生成,就可以克服這些問題。它減少對環境的依賴性,又反過來讓我們不用依賴資料庫來生成 id。這種方法還有乙個好處:它可以支援分布式。例如,我們可以將乙個表分割槽到兩個物理 sql server上,並分擔查詢的請求。如果我們有乙個自動增量的字段,這在 sql server 上就不行了。
我們決定做什麼??
基於這些事實,我們決定讓業務域層來生成域集合的識別符號。我們在域層內將這些識別符號表示為 64 位無符號整數。域消費者可以根據自己的上下文自由決定應該用什麼表示方式(例如asp.net core mvc 可以將識別符號序列化為字串,以便於其客戶端消費資源物件等)。
為什麼要 64 位整型,而不是 uuid?
最後,您可能想知道為什麼使用64位整數。此處的主要目的是使我們能夠甚至跨聚合根生成唯一的識別符號。考慮到幾乎每個平台都有對應的 api,uuid 是非常方便的呼叫方式(例如 .net 中 guid.newguid() 等)。uuid 最大的問題是儲存和索引方面的成本與開銷,雖然對我們來說不是大問題。不過,在分布式系統中,已經有一些成熟的方法來生成唯一識別符號作為更高效的主鍵型別,比如使用 64 位整數。twitter snowflake (1) 演算法就是其中之一,這讓我們選擇了 64 位整數而不是 uuid。我們使用的是 rob janssen 的開源 idgen (2) 庫,它是乙個適用於 .net 的 twitter snowflake 型別的 id 生成器。
(1)
(2)
英文原文:
高可用架構
改變網際網路的構建方式
為什麼我們需要域
對很多剛開始鑽研微軟技術的朋友來說,域是乙個讓他們感到很頭疼的物件。域的重要性毋庸置疑,微軟的重量級服務產品基本上都需要域的支援,很多公司招聘工程師的要求中也都明確要求應聘者熟悉或精通active directory。但域對初學者來說顯得複雜了一些,眾多的技術術語,例如active director...
堅持寫部落格對我們有什麼好處
今天發現csdn有點小更新,於是就再寫一篇。好處大了,今天來談談,寫部落格對我的益處,說起寫部落格,其實我寫部落格的時間不長,也就4來個月時間 等寫了一段時間部落格時,慢慢發現,其實之前的擔心的完全沒必要,你會的東西,精通的知識,即使分享出去,別人也未必能學的會,即時要學會學透,也是要花費時間和精力...
我們為什麼要用索引,用索引為什麼比不用索引快
經過老楊的細心指點,我才真正的明白 理解 記住 以前曾看過索引的資料,時間長都忘啦 老楊問我如果一張表上沒有索引,你要查id 5的記錄,資料庫會怎麼做?我說資料庫會先根據資料字典找到這張表,然後根據表頭的記錄找到這張表的資料塊,然後每個資料塊去找。老楊 會把所有的資料塊都掃一遍嗎?我 有可能會,有可...