標籤:
本文論述了現有Exchange會議室應用現狀和不足之處,並詳細介紹了Redis記憶體資料庫在Exchange會議室的應用,並給出了一種高效能的應用架構及採用關鍵技術和關鍵實現過程,最終實現大幅改進系統效能和改善使用者體驗,並為其他資訊系統的最佳化提供了有效參考。
一、Redis記憶體資料庫簡介
Key-Value 儲存系統是當下比較流行的話題,尤其在構建諸如搜尋引擎、即時通訊、P2P、遊戲伺服器、SNS等大型互連網應用以及提供雲端運算服務的時候有著大量的實際應用。
Key-Value 儲存系統更加註重對海量資料存取的效能、分布式、擴充性支援上,並不需要傳統關聯式資料庫的一些特徵,例如:Schema、事務、完整SQL查詢支援等等。
Redis是一個Key-Value儲存系統,也稱記憶體資料庫。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)和zset(有序集合)。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支援各種不同方式的排序。與Memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是Redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
二、Redis記憶體資料庫的應用現狀分析
(一)Redis適用的一些情境
1、取最新N個資料的操作;
2、熱門排行榜應用,取TOP N操作;
3、需要精準設定到期時間的應用;
4、計數器應用;
5、Uniq操作,擷取某段時間所有資料排重值;
6、即時系統,反垃圾系統;
7、Pub/Sub構建即時訊息系統;
8、構建隊列系統;
9、緩衝。
(二)Redis在新浪微博的典型應用分析
目前全球最大的Redis使用者是新浪微博,在新浪有200多台物理機,400多個連接埠正在運行著Redis, 有+4G的資料跑在Redis上來為微博使用者提供服務。
在新浪微博Redis的部署情境很多,大概分為如下的2種:
第一種是應用程式直接存取Redis資料庫
圖一 應用程式直接存取Redis
第二種是應用程式直接存取Redis,只有當Redis訪問失敗時才訪問MySQL
圖二 應用程式直接存取Redis失敗時訪問MySQL
(三)Exchange會議室應用現狀分析
目前公司會議室申請已在Outlook中進行操作,已實現會議室申請自動化的功能(無需人工幹預),且已有一年多的累計會議室資料,但在Outlook日曆中會議室查看或查詢存在嚴重缺陷,如無法查看會議申請人或參與人的部門及申請時間等資訊,無法進行匯總統計和資料匯出等,導致無法進行會議室分析與考核。由於Outlook的會議室儲存在Exchange的專用資料庫中,且Exchange的專用資料庫與通用的關係型資料庫如Oracle、Ms SQL Server、MySQL等有很大的不同,它沒有通用的驅動程式或API介面,不過微軟提供了基於.Net技術的專用API介面可以通過編程方式訪問Exchange會議室資料。
由於公司已實行windows域管理,且Exchange郵件伺服器與域進行了整合和綁定,也就是說會議室申請人的電子郵箱與windows活動目錄的使用者的電子郵箱屬性一一匹配的,且活動目錄的使用者存在組織架構的屬性(如部門、科室、組等資訊),這就為會議室查詢的二次開發整合創造了必要條件。
同時通過專用的API介面進行二次開發查詢在效能方面存在很大瓶頸,特別是跨月查詢的時候,耗時較長(可能會造成系統假死現象),使用者體驗差。
目前會議室可以提前7天申請,但對於會議室申請的曆史發生資料不會做任何變更操作,因此對於曆史發生資料可以定時同步到緩衝中,本文採用把會議室曆史發生資料定時同步到Redis中,為了提高計算效能,同時把Windows活動目錄中的所有在職使用者資訊也同步到Redis中,並給出了一個高效能的應用架構,有效解決了系統效能問題和資料曆史存檔問題(如採用即時事務查詢機制,一旦某會議室刪除,將導致其所有資料丟失,無法進行查詢),不僅大大提高了使用者體驗,而且為會議室分析與考核提供了平台。
三、Redis記憶體資料庫在Exchange會議室的應用
(一)整體應用架構
圖三 Redis記憶體資料庫在Exchange會議室的整體應用架構
根據以上的會議室應用現狀分析,該架構的核心是把曆史發生的會議室申請資料定時同步到Redis記憶體資料庫中,對於現在和未來時間的會議室資料(目前可以提前7天申請資料)則通過專用介面在Exchange會議室資料庫即時查詢,根據使用者選取查詢時間,系統自動判斷訪問哪個資料庫或進行資料合併(曆史資料與現在或未來時間的資料),通過減少訪問Exchange會議室資料庫以提高查詢效能,從而大大改善使用者體驗,通過與Windows活動目錄的使用者的整合,為會議室分析和考核提供資料支援。
(二)關鍵技術簡介
1、ServiceStack.Redis驅動
ServiceStack.Redis是最受歡迎的開源C#驅動之一,用於訪問和讀取Redis,它封裝了大量方法和對象,這樣使二次開發相當容易,如提供了基本KEY/VALUE索引值對操作、儲存物件、儲存表格對象、使用用戶端連結池模式提升連結速度等。
本文採用了ServiceStack.Redis進行二次開發,通過二次開發的介面把Exchange的會議室和Windows活動目錄的所有在職使用者資料同步Redis中,同時對於曆史會議室資料提供查詢介面。
2、Microsoft.Exchange.WebServices類庫
Microsoft.Exchange.WebServices類庫是微軟官方提供的專門訪問Exchange郵件伺服器的API,如可以根據此類庫編程實現讀取會議室資料、郵件、連絡人、議程等,可以根據需要進行定製開發以滿足不同的應用需求。
本文主要使用此類庫讀取會議室的資料,並結合SystemComponent.ADHelper類庫讀取會議申請人和參與人的部門資訊。
3、SystemComponent.ADHelper類庫
SystemComponent.ADHelper類庫是本人為BPM項目開發的操作windows活動目錄(組織單位、組、使用者)的通用類庫,可以進行複用,目前在BPM項目中已有廣泛應用。
本文主要使用此類庫根據電子郵箱獲得會議申請人和參與人的所屬部門資訊。
4、Quartz.NET作業架構
Quartz.NET是一個開源的作業調度架構,是OpenSymphony 的 Quartz API的.NET移植,它用C#寫成,可用於winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。能夠用它來為執行一個作業而建立簡單的或複雜的調度。它有很多特徵,如:資料庫支援,叢集,外掛程式,支援cron-like運算式等等。
本文主要使用此作業架構進行定製開發同步程式,實現定時同步Exchange會議室資料到Redis中,並在Windows服務中運行(實現自動化作業,無需人工幹預)。
(三)關鍵實現過程
1、定時同步Exchange會議室資料和Windows活動目錄的所有在職使用者到Redis中
主要通過以上的關鍵技術進行二次開發和整合成Windows服務程式,開發完成的程式檔案清單如:
圖四 定時同步Exchange會議室和windows活動目錄使用者程式檔案清單
在Windows中部署後的服務如:
圖五 定時同步Exchange會議室和windows活動目錄使用者到Redis服務
該服務的設定檔(定義了資料同步的周期、需要同步的會議室、活動目錄的使用者路徑等資訊),如:
圖六 定時同步Exchange會議室和windows活動目錄使用者到Redis服務組態檔
通過在Redis設定檔設定Redis持久化,即Redis非同步把記憶體中資料寫入到本地Redis資料庫中(dump.rdb),本文配置了每天淩晨4點自動同步一次昨天的Exchange會議室資料到Redis中,如:
圖七 Redis持久化
持久化的好處在於即使重啟Redis伺服器,記憶體資料也不會丟失(Redis服務會根據本地Redis資料庫自動載入到記憶體中),因此大大提高了系統可靠性和可用性,而且可移植性好(只要拷貝dump.rdb檔案就可以移植到其他Redis伺服器中使用)。
2、定製開發的會議室查詢助手
通過進行定製開發的會議室查詢助手,從Redis記憶體資料庫中讀取會議室曆史資料(資料不會發生變更),從Exchange會議室資料庫中讀取提前申請的會議室資料(資料可能隨時都會發生變更),通過兩部分的資料群組合,一方面提高了系統效能,另一方面保證了資料的準確性,該工具主介面如:
圖八 用戶端Outlook會議室報表查詢助手
系統可以根據會議時間段和會議室列表條件進行查詢,同時支援以所見所得的方式匯出為Excel檔案,便於二次處理(統計分析、考核),如:
圖九 匯出後Outlook會議室報表查詢
為了方便全員共用和查詢,除了提供用戶端查詢工具外(主要面向會議室管理員和績效考核人員),可以二次開發在企業門戶中進行展現,如:
圖十 企業門戶Outlook會議室報表查詢
(四) 實際應用效果分析
以惠普Z600工作站電腦進行測試為例,具體硬體資訊如:
圖十一 惠普Z600工作站電腦硬體資訊
Redis記憶體資料庫與直接讀取Exchange會議室資料的效能對比分析,如:
圖十二 Redis記憶體資料庫與Exchange會議室資料庫讀取效能分析
從圖十二可以看到,讀取Redis記憶體資料庫均在0.5秒左右,會議時間段的長短對Redis效能影響微小,而對於Exchange會議室資料庫的會議時間段長短影響則巨大,兩者效能相差幾十倍到幾百倍不等。採用Redis記憶體資料庫無論是效能,還是使用者體驗都非常好,因此採用Redis記憶體資料庫是一個較好的解決方案。
四、總結
本文提出了一種基於Redis記憶體資料庫在Exchange會議室應用的解決方案,並給出了相應的關鍵技術和實現過程,最後對應用效果進行了分析。該解決方案在功能、效能等方面能較好地滿足終端使用者和管理的需求,在系統架構上非常靈活,可擴充性和可移植性好,開發組件非常容易進行複用。
對於需要高效能、高並發的應用情境和其他相關資訊系統的最佳化提供了有效參考,可以按照本文提出了一種基於Redis記憶體資料庫的應用架構進行最佳化和改善。
轉載自處:http://www.cnblogs.com/nbpowerboy/p/4322724.html
Redis記憶體資料庫在Exchange會議室的應用(轉)