Q:Mongodb資料服務有什麼用?
A:首先,Mongodb適合儲存大量的非業務資料,因此,Adhesive架構提倡把不是非常重要的非業務資料(比如應用程式資訊中心的日誌、異常、狀態資料,又比如WCF擴充模組的WCF調用資料,或者其它的各種業務日誌、監控日誌)儲存在Mongodb中。雖然Mongodb的非結構化模式適合儲存各種類型的資料,但是我們不得不針對各種類型的資料進行重複開發來解決一些問題:
1)往往大量的資料希望是後台隊列非同步提交的,並且還需要容忍服務端和資料庫的短時間不可用,因此需要開發一套用戶端和服務端的雙隊列。
2)在資料儲存到資料庫的時候需要考慮分表和分庫,資料儲存後需要考慮索引的建立、曆史資料的刪除。
3)最重要的是,資料不是儲存就了事了,我們還需要針對不同的資料開發一套後台,涉及到許可權、各種方式的瀏覽。
在以前,我們針對每一個業務都需要進行短則一周,長則一個月的開發,開發一套用戶端收集資料的程式、開發一套服務端提交資料的程式、再開發一套背景程式。
而現在,Mongodb資料服務負責搞定這所有的一切,可以這麼說,如果希望把自訂的任何資料通過Mongodb資料服務儲存到Mongodb中去的話,您只需要
1)花10分鐘左右來涉及自訂類,並且為屬性應用一些特性來告訴Mongodb資料服務如何儲存和呈現這些資料。
2)花5分鐘左右來配置許可權、用戶端、服務端等等。
3)花10秒的時間,調用一行語句進行入庫。
不管是什麼程式日誌、業務日誌,不到20分鐘時間的開發,您就可以在Mongdb資料服務的後台以各種方式看到資料。
Q:Mongodb資料服務的亮點在哪裡?
A:除了上面說的,可以節省開發時間之外,其它亮點如下:
1)可以進行簡單的配置來完成相對比較複雜的組合查詢,比如要實作類別型這樣的搜尋:
只需要定義中繼資料即可:
[MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "借書者", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.TextBoxFilter)] public string UserName { get; set; } [MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "狀態變化", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.DropDownListFilter)] public Status Status { get; set; } [MongodbPersistenceItem(MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "書籍分類", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.CheckBoxListFilter)] public string Category { get; set; }
又比如我們希望記錄一個動作記錄:
中繼資料定義如下:
[MongodbPersistenceItem(ColumnName = "A", MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "行為", ShowInTableView = true, MongodbFilterOption = MongodbFilterOption.DropDownListFilter)] public string Action { get; set; } [MongodbPersistenceItem(ColumnName = "C", MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "分類", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelOne)] public string CategoryName { get; set; } [MongodbPersistenceItem(ColumnName = "D", MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "資料庫", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelTwo)] public string DatabaseName { get; set; } [MongodbPersistenceItem(ColumnName = "TN", MongodbIndexOption = MongodbIndexOption.Ascending)] [MongodbPresentationItem(DisplayName = "表", ShowInTableView = true, MongodbCascadeFilterOption = MongodbCascadeFilterOption.LevelThree)] public string TableName { get; set; }
這裡可以看到,在後台不但呈現出了這些搜尋控制項,並且也填充了內容。由於考慮到效能,這些Distinct的資料不是通過Mongodb的Distinct功能完成的,而是在插入資料的時候統計這些資料,定時雙向同步到Mongodb中的中繼資料表:
2)豐富的查詢方式:
列表:
資料量統計:
分組統計:
詳細:
不管是希望看列表、看資料量統計、看資料分組統計還是詳細資料都可以滿足要求,不許開發一行代碼。
3)系統自己會處理分表、分庫、到期資料、索引、緩衝、隊列等等。。。
Q:Mongodb資料服務的應用範圍在哪裡?
A:一般Mongodb適合儲存非業務資料,由於Mongodb資料服務模組使用的是用戶端和服務端的雙隊列,因此即使資料量再大也不會影響正常業務的進行,但資料可能會在服務不可用並且隊列滿的時候丟失。因此儲存程式日誌、業務日誌、動作記錄、監控資料、異常資訊、反饋資訊等等資料非常適合。需要說明的是,Adhesive架構的應用程式資訊中心模組以及WCF分布式服務模組的所有日誌都採用Mongodb資料服務進行儲存。
Q:如何自訂對象以及使用Mongodb資料服務?
A:參見文章http://www.cnblogs.com/lovecindywang/archive/2011/10/28/2227808.html
Q:在自訂對象上配置的中繼資料改動了會怎麼樣?
A:從用戶端方面來說每一種類型的中繼資料中繼資料會隨著第一條資料提交到服務端,並且只會提交一次,因此如果你改了中繼資料,肯定是需要重新啟動系統的,在啟動後新的中繼資料會儲存到資料庫中,從服務端方面來說,中繼資料不會每次都從資料庫擷取,只是在“維護”的時候同步一次,預設的維護時間是1分鐘,因此中繼資料修改後1分鐘後可以在後台看到效果。
1)如果刪除了列,那麼列的中繼資料也會丟失,在後台可能就不會看到這個列了,但是老的資料不會丟失。
2)如果增加了以及列的中繼資料,那麼相關列的值對於老的資料可能就是空,只會在新資料出現新的列。
3)如果要對既有列修改中繼資料的話,不能修改MongodbPersistenceItem的ColumnName也就是資料庫中的列名,否則老的資料都會顯示不出來。
Q:Mongodb資料服務的結構是怎麼樣的?
A:Mongodb資料服務寫入資料的流程如下:插入資料到用戶端隊列-用戶端隊列取出資料提取中繼資料進行資料重組-用戶端隊列通過WCF分布式服務模組提交資料到服務端隊列-服務端隊列-服務端隊列取出資料進行索引項目更新-服務端隊列把資料提交到資料庫
Mongodb資料服務讀取資料的流程如下:通過WCF分布式服務模組串連服務端讀取資料-服務端從資料庫取出實際的資料-服務端從記憶體中擷取中繼資料-服務端把實際資料和中繼資料進行合并並返回用戶端
Mongodb資料服務的服務端有一個很重要的維護服務,它的工作如下:
1)同步中繼資料
2)同步列的索引資料(比如進階資料篩選下拉框和多選框的內容)
3)清空曆史資料(如果設定了到期天數的話)
4)從資料庫擷取資料庫伺服器、資料庫、表、索引四個層次的實際狀態
5)建立索引
Q:Mongodb資料服務的配置需要注意哪些地方?
A:注意點如下:
1)在新定義自訂類型之後需要在佈建服務中配置資料項目,否則資料無法提交到服務端也無法提交到資料庫
2)定義在列上的特性注意衝突和一些約束,盡量
3)適當清空下修改預設的參數(比如隊列提交批次、最大資料條數)來改善效能
Q:Mongodb資料服務需要怎麼配置Mongodb?
A:我們的每一個類型可以配置不同的伺服器叢集,因此在一定程度上可以實現方便的擴容:
考慮到分擔壓力,系統預設支援讀(後台查詢)寫(提交資料以及維護)分離,因此可以配置MASTER-SALVE的Mongodb
需要注意的是,在理論情況下,後台進行的所有操作都不會進行表掃描,在索引未建立完成的情況下,是不會出現相關的搜尋控制項的,因此可以配置Mongodb為不允許表掃描:
Q:Mongodb資料服務可以使用老的Mongodb叢集嗎?
A:可以,Mongodb資料服務通過Metadata資料庫來知道哪些是自己的資料庫,其它資料庫不會去管理,後台也看不到。