專利名稱:一種基于Erlang的分布式數(shù)據(jù)緩存和持久化的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)路游戲領(lǐng)域,具體地說是一種實(shí)現(xiàn)分布式數(shù)據(jù)緩存和持久化的方 法和系統(tǒng)。
背景技術(shù):
Erlang程序語言是由愛立信公司開發(fā)并公開的函數(shù)式程序語言,成功應(yīng)用于電 信領(lǐng)域。Erlang語言本身對并行計(jì)算和分布式有很好的支持,分布式-Erlang被設(shè)計(jì)用于 運(yùn)行在分布式環(huán)境下,一個Eriang虛擬機(jī)被成為Erlang節(jié)點(diǎn),一個分布式Eriang系統(tǒng)是 多個Eriang節(jié)點(diǎn)組成的網(wǎng)絡(luò)(通常每個處理器被作為一個節(jié)點(diǎn))。Erlang程序以輕量級 進(jìn)程為基本單位在Eriang虛擬機(jī)節(jié)點(diǎn)(node)上執(zhí)行,而每個節(jié)點(diǎn)作為一個操作系統(tǒng)進(jìn)程 獨(dú)立執(zhí)行,在集群中可以有任意多個節(jié)點(diǎn),每個節(jié)點(diǎn)有唯一的名字,節(jié)點(diǎn)間的底層通信 由Erlang虛擬機(jī)負(fù)責(zé)。Eriang語言提供的數(shù)據(jù)持久化工具是Mnesia數(shù)據(jù)庫,Mnesia是 Erlang語言開發(fā)環(huán)境提供的數(shù)據(jù)庫,Mnesia內(nèi)建了對于分布式環(huán)境的支持,程序員可以 通過簡單的配置搭建起多機(jī)多節(jié)點(diǎn)分布式的Mnesia數(shù)據(jù)庫,各節(jié)點(diǎn)間的數(shù)據(jù)同步則可交 由Mnesia去負(fù)責(zé)。
對于一個高性能的服務(wù)器應(yīng)用來說,設(shè)計(jì)的可擴(kuò)展性非常重要,集群是最常見 的一種設(shè)計(jì)方式。如何解決分布式的數(shù)據(jù)訪問與持久化,是系統(tǒng)的核心設(shè)計(jì)問題之一。
最顯而易見的方法是利用Mnesia數(shù)據(jù)庫的特性,對于一個數(shù)據(jù)表來說,只需要 在每個節(jié)點(diǎn)加載一份持久化表的鏡像就可以實(shí)現(xiàn)分布式訪問,而任何對數(shù)據(jù)的修改都會 自動被同步到集群中。
Mnesia所提供的這種自動化數(shù)據(jù)同步服務(wù)使用方便,但是其通用的設(shè)計(jì)也犧牲 了很多性能和資源。Mnesia把表數(shù)據(jù)同步給集群中每一個節(jié)點(diǎn),程序員無法控制這個同 步操作的范圍,由于很多時候并不是每個節(jié)點(diǎn)都需要這個表的最新數(shù)據(jù),所以這種無差 別、不可控的同步操作往往會帶來不必要的資源消耗,在某些對實(shí)時性要求比較高的應(yīng) 用中,比如網(wǎng)絡(luò)游戲的服務(wù)器端軟件,這種性能損失是不可接受的。
另外,對于高性能系統(tǒng)來說,數(shù)據(jù)緩存不可或缺,然而獨(dú)立的緩存機(jī)制有這些 問題
1、將緩存操作細(xì)節(jié)暴露給業(yè)務(wù)邏輯,會增加業(yè)務(wù)邏輯的復(fù)雜度;
2、傳統(tǒng)的緩存是被動的,業(yè)務(wù)邏輯無法獲知緩存數(shù)據(jù)的變化;
3、由于每個對緩存的訪問是獨(dú)立和分散的,在特定情況下,緩存數(shù)據(jù)未命中會 引起瞬間大量的持久數(shù)據(jù)IO操作,形成風(fēng)暴,嚴(yán)重影響系統(tǒng)的性能。發(fā)明內(nèi)容
為了解決上述問題,本發(fā)明提供了一種實(shí)現(xiàn)基于Erlang的分布式數(shù)據(jù)緩存和持 久化的方法。
本發(fā)明中將負(fù)責(zé)數(shù)據(jù)持久化的節(jié)點(diǎn)稱作持久化節(jié)點(diǎn),負(fù)責(zé)執(zhí)行業(yè)務(wù)邏輯的節(jié)點(diǎn) 稱作業(yè)務(wù)節(jié)點(diǎn)。
所述方法為在業(yè)務(wù)邏輯和數(shù)據(jù)庫之間設(shè)置代理層,所有對于數(shù)據(jù)庫的操作請 求都發(fā)往所述代理層,對數(shù)據(jù)庫進(jìn)行擴(kuò)展,所述代理層進(jìn)行分析和排序后,再依照某種 時間和空間策略對數(shù)據(jù)進(jìn)行持久化,持久化策略以Erlang進(jìn)程的形式運(yùn)行,持久化以后 將數(shù)據(jù)寫入數(shù)據(jù)庫;在所述代理層內(nèi)集合緩存控制邏輯,負(fù)責(zé)一切數(shù)據(jù)緩存的操作。
代理層的數(shù)據(jù)接口分析每一個數(shù)據(jù)操作對于查詢操作,直接使用數(shù)據(jù)緩存中 的數(shù)據(jù),如果緩存未命中則從持久化數(shù)據(jù)源加載;對于寫操作,更新緩存中的數(shù)據(jù),并 將數(shù)據(jù)操作通知到持久化策略。
緩存控制邏輯負(fù)責(zé)對緩存的訪問,比如緩存數(shù)據(jù)加載、讀取、刪除和改寫。實(shí) 際使用的存儲方式可以是支持集群訪問的方式,如Mnesia表,或者是節(jié)點(diǎn)內(nèi)訪問的高效 存儲方式,比如ETS (ETS是Erlang虛擬機(jī)提供的一種簡單的節(jié)點(diǎn)內(nèi)鍵_值數(shù)據(jù)存儲/查 詢服務(wù))或進(jìn)程字典。更換不同的存儲方式只需要更換緩存控制邏輯的實(shí)現(xiàn)即可
進(jìn)一步所述持久化策略接收數(shù)據(jù)接口模塊對數(shù)據(jù)記錄的操作,對多次相同的 操作進(jìn)行合并,保持不同類型操作間的順序正確,并按照某種時間或空間策略進(jìn)行持久 化。
可選的所述緩存數(shù)據(jù)庫為ETS,所述緩存為節(jié)點(diǎn)內(nèi)緩存,持久化策略記錄操 作,并按照某種時間或空間策略匯總同步給持久數(shù)據(jù)源寫入磁盤。
可選的所述緩存為最終一致性緩存,在持久化節(jié)點(diǎn)進(jìn)行同步服務(wù),把磁盤表 的變化同步給各業(yè)務(wù)節(jié)點(diǎn),同步服務(wù)是一個進(jìn)程或進(jìn)程池,同步服務(wù)維護(hù)數(shù)據(jù)記錄的訂 閱列表。
可選的,所述緩存的實(shí)現(xiàn)為集群訪問,持久化策略進(jìn)程把操作記錄序列異步發(fā) 往持久化服務(wù)進(jìn)程,持久化服務(wù)進(jìn)程接收操作記錄并更新磁盤表。
可選的所述緩存控制操作非持久化Mnesia表的數(shù)據(jù),所述持久化策略通過 訂閱Mnesia非持久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的操作,對多次相同的操作進(jìn)行合 并,保持不同類型操作間的順序正確,并按照某種時間或空間策略進(jìn)行持久化。
可選的,所述緩存的實(shí)現(xiàn)為節(jié)點(diǎn)內(nèi)Mnesia緩存和更新訂閱,緩存用Mnesia非持 久化表實(shí)現(xiàn);每個業(yè)務(wù)節(jié)點(diǎn)自行在本地加載持久化緩存表的數(shù)據(jù),緩存控制邏輯操作本 節(jié)點(diǎn)的緩存表,其節(jié)點(diǎn)間的數(shù)據(jù)同步由Mnesia負(fù)責(zé);系統(tǒng)根據(jù)某種策略為所述緩存表建 立持久化策略進(jìn)程。
本發(fā)明的另一目的是提供一種性能高、維護(hù)成本低、運(yùn)行快的基于Eriang的分 布式數(shù)據(jù)緩存和持久化系統(tǒng)。
所述系統(tǒng)包括
業(yè)務(wù)邏輯模塊,實(shí)際業(yè)務(wù)邏輯;
數(shù)據(jù)接口模塊,業(yè)務(wù)邏輯模塊通過所述數(shù)據(jù)接口模塊訪問系統(tǒng)中的數(shù)據(jù),實(shí)現(xiàn) 數(shù)據(jù)庫的接口;
持久化策略,Erlang進(jìn)程,接收對數(shù)據(jù)記錄的操作,對多次相同的操作進(jìn)行 合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié)點(diǎn)上的持久化服務(wù)進(jìn) 程;
非持久化表,內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存;
持久化服務(wù)模塊,運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù) 操作序列,并將數(shù)據(jù)改動定期寫入持久化表;
持久化表,存放持久化的數(shù)據(jù)。
本發(fā)明還提供了一種性能高、維護(hù)成本低、運(yùn)行快的基于Eriang的分布式數(shù)據(jù) 緩存和持久化系統(tǒng),所述系統(tǒng)包括
業(yè)務(wù)邏輯實(shí)際業(yè)務(wù)邏輯;
數(shù)據(jù)接口模塊Erlang模塊,業(yè)務(wù)邏輯模塊通過所述數(shù)據(jù)接口模塊訪問系統(tǒng)中 的數(shù)據(jù),在非持久化節(jié)點(diǎn)上,數(shù)據(jù)接口模塊將最新數(shù)據(jù)更新到本節(jié)點(diǎn)的對應(yīng)Mnesia非持 久化表中;
持久化策略Erlang進(jìn)程,每個非持久化表對應(yīng)一個持久化策略進(jìn)程,所述進(jìn) 程通過訂閱Mnesia非持久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的操作,對多次相同的操作 進(jìn)行合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié)點(diǎn)上的持久化服 務(wù)進(jìn)程;
非持久化表Mnesia內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供 高速的數(shù)據(jù)讀取服務(wù);
持久化服務(wù)模塊運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù) 操作序列,并將數(shù)據(jù)改動定期寫入Mnesia持久化表;
持久化表Mnesia磁盤表,存放持久化的數(shù)據(jù)。
本發(fā)明提供的基于Erlang的分布式數(shù)據(jù)緩存和持久化的方法,在業(yè)務(wù)節(jié)點(diǎn)和數(shù) 據(jù)庫之間設(shè)置代理層,實(shí)質(zhì)上是對原有的數(shù)據(jù)庫進(jìn)行擴(kuò)展,并且通過在中間層增加了程 序員對數(shù)據(jù)庫行為的控制力。通過這個代理層數(shù)據(jù)變化只會在必要的范圍內(nèi)進(jìn)行同步, 大大減少了數(shù)據(jù)同步所占用的資源,提升了系統(tǒng)性能;代理層內(nèi)的緩存邏輯使得業(yè)務(wù)邏 輯不再需要關(guān)心數(shù)據(jù)的存放位置,不再需要知道數(shù)據(jù)的存放和讀取流程,降低了業(yè)務(wù)邏 輯的復(fù)雜度,業(yè)務(wù)邏輯可以獲知緩存數(shù)據(jù)的變化,使得系統(tǒng)穩(wěn)定,降低了系統(tǒng)的維護(hù)成 本。
圖1為本發(fā)明實(shí)施例1所提供方案的示意圖
圖2為實(shí)施例1提供的系統(tǒng)的框架圖3為實(shí)施例2所提供方案的示意圖4為實(shí)施例3所提供方案的示意圖5為實(shí)施例4所提供方案的示意圖6為實(shí)施例4多提供系統(tǒng)的框架圖7為實(shí)施例5所提供方案的示意圖。
具體實(shí)施方式
集群中存在持久化節(jié)點(diǎn)和非持久化節(jié)點(diǎn)持久化節(jié)點(diǎn)負(fù)責(zé)把數(shù)據(jù)持久化到磁盤 上;非持久化節(jié)點(diǎn)負(fù)責(zé)業(yè)務(wù)邏輯的處理。
為了控制數(shù)據(jù)同步的范圍,本方法是在業(yè)務(wù)邏輯和數(shù)據(jù)庫之間增加代理層,所 有對于數(shù)據(jù)庫的操作請求都發(fā)往該代理層,對數(shù)據(jù)庫進(jìn)行擴(kuò)展,代理層對所有請求進(jìn)行 分析和排序后,再依照設(shè)定的某個時間(定期/隊(duì)列)或空間(集中/分布)策略對數(shù)據(jù) 進(jìn)行持久化,持久化以后將數(shù)據(jù)寫入數(shù)據(jù)庫;并且在代理層內(nèi)集合緩存控制邏輯,負(fù)責(zé) 一切數(shù)據(jù)緩存的操作。
代理層的數(shù)據(jù)接口與業(yè)務(wù)邏輯實(shí)現(xiàn)數(shù)據(jù)的交互,可以進(jìn)行數(shù)據(jù)的查詢、增加、 刪除和接口的改寫。而持久化策略接收數(shù)據(jù)接口對數(shù)據(jù)記錄的操作,比如對數(shù)據(jù)記錄的 增加、改寫、刪除操作,可以對多次相同的操作進(jìn)行合并,定期將合并后的操作序列發(fā) 送至持久化節(jié)點(diǎn)上的持久化服務(wù)進(jìn)程。
緩存的實(shí)際實(shí)現(xiàn)可以有很多種,可以是第三方的內(nèi)存鍵-值存儲軟件,例如 memcached,也可以是此例中Erlang提供的、集成在Erlang運(yùn)行環(huán)境中的數(shù)據(jù)庫Mnesia、 ETS0根據(jù)具體對緩存訪問特性的具體需求,可以有不同幾種具體設(shè)計(jì)方案。
以下為在網(wǎng)絡(luò)游戲服務(wù)端軟件中使用所述方法和系統(tǒng)的例子。
實(shí)施例1
如圖1所示,本實(shí)施例提供的是節(jié)點(diǎn)內(nèi)緩存情況下的方案
在這個方法中,緩存使用節(jié)點(diǎn)內(nèi)訪問的實(shí)現(xiàn),比如ETS.每個業(yè)務(wù)節(jié)點(diǎn)有獨(dú)立的 一份緩存,其數(shù)據(jù)根據(jù)需要獨(dú)立加載。
具體方案為
1、業(yè)務(wù)邏輯發(fā)起對某個緩存數(shù)據(jù)記錄的訪問;
2、緩存控制從本機(jī)緩存取數(shù)據(jù)記錄,如果未命中則從持久數(shù)據(jù)中加載;
3、緩存控制返回訪問結(jié)果,數(shù)據(jù)訪問完成;
4、對于寫操作,持久化策略記錄本次操作,并按照某種時間空間策略匯總同步 給持久數(shù)據(jù)源寫入磁盤;
5、當(dāng)業(yè)務(wù)邏輯不再需要訪問這個數(shù)據(jù)記錄,需要強(qiáng)制本節(jié)點(diǎn)的持久化策略立即 將此數(shù)據(jù)記錄相關(guān)的操作記錄同步給持久數(shù)據(jù)源,然后通知緩存控制邏輯使本節(jié)點(diǎn)對應(yīng) 的緩存記錄失效,具體做法可以是做無效標(biāo)記,或者從本機(jī)緩存中刪除。
這個方案適合各業(yè)務(wù)節(jié)點(diǎn)緩存數(shù)據(jù)沒有交集的情況,一個記錄的有效鏡像任意 時刻只能存在于一個節(jié)點(diǎn)中。當(dāng)另一個節(jié)點(diǎn)需要此記錄時,需要使舊鏡像無效化.具體做 法可以是把舊鏡像刪除,或者停止業(yè)務(wù)邏輯對其的訪問。
此方案的性能由有效緩存鏡像在節(jié)點(diǎn)間移動的平均頻率決定,移動頻率越高命 中率越低;對于一個緩存的數(shù)據(jù)記錄,業(yè)務(wù)邏輯從設(shè)計(jì)上需要確保任意時刻只有一個業(yè) 務(wù)節(jié)點(diǎn)需要訪問它,以避免命中率過低。
如圖2所示,本實(shí)施例中實(shí)現(xiàn)所述方法的具體的系統(tǒng)包括
業(yè)務(wù)邏輯模塊,實(shí)際業(yè)務(wù)邏輯(不屬于本發(fā)明保護(hù)的范圍);
數(shù)據(jù)接口模塊,Erlang模塊,實(shí)現(xiàn)對緩存的訪問,業(yè)務(wù)邏輯模塊通過此模塊訪 問系統(tǒng)中的數(shù)據(jù).在非持久化節(jié)點(diǎn)上,此模塊會將最新數(shù)據(jù)更新到本節(jié)點(diǎn)對應(yīng)的非持久化 表中;
持久化策略,Eriang進(jìn)程,接收對數(shù)據(jù)記錄的增加,改寫,刪除操作,對多次 相同的操作進(jìn)行合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié)點(diǎn)上的持久化服務(wù)進(jìn)程;
非持久化表,內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供高速的 數(shù)據(jù)讀取服務(wù);JU本來說可以是ETS或者講禾早字典
持久化服務(wù)模塊,運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù) 操作序列,并將數(shù)據(jù)改動定期寫入持久化表;
持久化表,磁盤表,存放持久化的數(shù)據(jù)。
實(shí)施例2
如圖3所示,本實(shí)施例提供的是最終一致性緩存情況下的方案當(dāng)集群中緩存 鏡像的實(shí)時一致性要求不高時,同時需要最大化業(yè)務(wù)節(jié)點(diǎn)訪問緩存的速度時,在實(shí)施例1 的基礎(chǔ)上有下述優(yōu)化方案
在這個方案中,持久化節(jié)點(diǎn)需要實(shí)現(xiàn)同步服務(wù),負(fù)責(zé)把磁盤表的變化同步給各 業(yè)務(wù)節(jié)點(diǎn)。同步服務(wù)可以是一個進(jìn)程或進(jìn)程池,同步服務(wù)維護(hù)數(shù)據(jù)記錄的訂閱列表。
具體方案為
1、業(yè)務(wù)邏輯發(fā)起對某個緩存數(shù)據(jù)記錄的訪問;
2、緩存控制從本機(jī)緩存取數(shù)據(jù)記錄,如果未命中則從持久數(shù)據(jù)中加載,并向同 步服務(wù)訂閱此鏡像的數(shù)據(jù)變動;后者把該節(jié)點(diǎn)加入此數(shù)據(jù)記錄的訂閱列表中;
3、業(yè)務(wù)節(jié)點(diǎn)訪問節(jié)點(diǎn)內(nèi)緩存的數(shù)據(jù)鏡像;
4、業(yè)務(wù)節(jié)點(diǎn)的持久化策略進(jìn)程把業(yè)務(wù)邏輯產(chǎn)生的數(shù)據(jù)改寫操作發(fā)給同步服 務(wù);
5、在完成業(yè)務(wù)節(jié)點(diǎn)持久化策略發(fā)來的數(shù)據(jù)操作后,同步服務(wù)把數(shù)據(jù)變化通知給 訂閱列表中的業(yè)務(wù)節(jié)點(diǎn);
6、業(yè)務(wù)節(jié)點(diǎn)接到通知后使本節(jié)點(diǎn)對應(yīng)的數(shù)據(jù)鏡像無效,使本節(jié)點(diǎn)下一次對此記 錄的訪問未命中。
在這個方案中一個數(shù)據(jù)記錄可能有多個緩存鏡像,這些鏡像分布在不同的業(yè)務(wù) 節(jié)點(diǎn)上,任意時刻其鏡像可能不一致,對于每一次改寫操作來說,緩存數(shù)據(jù)滿足最終一 致性要求。
此方案適用于業(yè)務(wù)節(jié)點(diǎn)對緩存的訪問速度要求很苛刻,但是并不要求緩存數(shù)據(jù) 在任一時刻都和磁盤數(shù)據(jù)一致的情況。
實(shí)現(xiàn)本方案的系統(tǒng)如實(shí)施例1所述。
實(shí)施例3
如圖4所示,本實(shí)施例提供的是集群訪問的緩存情況下的方案
具體方案為
1、業(yè)務(wù)節(jié)點(diǎn)上的業(yè)務(wù)邏輯調(diào)用代理層的數(shù)據(jù)接口來訪問某個數(shù)據(jù)表T ;
2、數(shù)據(jù)接口調(diào)用緩存控制邏輯來請求數(shù)據(jù);
3、緩存控制邏輯操作非持久化表的數(shù)據(jù);根據(jù)所使用的具體緩存可以更換不同 的實(shí)現(xiàn),默認(rèn)使用Mnesia非持久化表,訪問邏輯直接用Mnesia提供的接口;對于Mnesia 非持久化表來說,Mnesia負(fù)責(zé)在集群中定位和數(shù)據(jù)傳送;
4、寫操作,數(shù)據(jù)接口模塊把本次操作包裝成操作日志(Erlang tuple),異步發(fā)給 本節(jié)點(diǎn)內(nèi)的持久化策略進(jìn)程;
5、數(shù)據(jù)接口返回結(jié)果,業(yè)務(wù)邏輯的數(shù)據(jù)訪問請求完成;
6、持久化策略進(jìn)程將操作日志記錄在進(jìn)程字典中;
7、當(dāng)記錄的日志序列達(dá)到某個預(yù)設(shè)的個數(shù),或者當(dāng)計(jì)時器到時時,持久化策略 進(jìn)程把操作記錄序列異步發(fā)往持久化服務(wù)進(jìn)程,后者注冊Global名,其在集群中的定位 由Erlang虛擬機(jī)負(fù)責(zé);
8、持久化服務(wù)進(jìn)程接收操作記錄并更新磁盤表。
各模塊初始化時試圖在集群中創(chuàng)建所需要的非持久化表,Mnesia保證集群中此 表唯一,如果已被創(chuàng)建則自動忽略此操作;如果成功創(chuàng)建則立即從對應(yīng)的持久化表加載 數(shù)據(jù),這里不需要考慮持久化表的物理位置,Mnesia負(fù)責(zé)底層的通信;對與每個新創(chuàng)建 的非持久化表,建立一個持久化策略進(jìn)程,該進(jìn)程訂閱此表的所有數(shù)據(jù)改寫事件。
在這種實(shí)現(xiàn)中,數(shù)據(jù)的讀寫操作僅發(fā)生在緩存上,持久化策略也是異步的,次 數(shù)也能夠被控制,系統(tǒng)中數(shù)據(jù)訪問的性能開銷被大大減少。利用這種節(jié)點(diǎn)內(nèi)緩存和異步 持久化的設(shè)計(jì),在相同條件下系統(tǒng)的平均負(fù)載比使用Mnesia的分布式同步機(jī)制時降低了 30%到 40%。
本實(shí)施例方案實(shí)現(xiàn)所對應(yīng)的系統(tǒng)如圖2所示,其區(qū)別點(diǎn)在于
非持久化表為Mnesia內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供 高速的數(shù)據(jù)讀取服務(wù);
持久化服務(wù)模塊,運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù) 操作序列,并將數(shù)據(jù)改動定期寫入持久化表;
持久化表為Mnesia磁盤表,存放持久化的數(shù)據(jù)。
數(shù)據(jù)接口模塊實(shí)現(xiàn)了 Mnesia數(shù)據(jù)庫的接口,業(yè)務(wù)邏輯模塊通過此模塊訪問系統(tǒng) 中的數(shù)據(jù).在非持久化節(jié)點(diǎn)上,此模塊會將最新數(shù)據(jù)更新到本節(jié)點(diǎn)的對應(yīng)Mnesia非持久化 表中。
當(dāng)然此方案中,也可以是非持久化表用Mnesia數(shù)據(jù)庫,持久化表用外部數(shù)據(jù) 庫,比如MvSOL(開源數(shù)據(jù)庫)。
實(shí)施例4
如圖5所示,本實(shí)施例提供的方法是實(shí)施例3提供的方法的優(yōu)化方案,如果采用 Mnesia數(shù)據(jù)庫,則可以做以下優(yōu)化每個非持久化表對應(yīng)一個持久化策略進(jìn)程,此進(jìn)程 通過訂閱Mnesia非持久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的增加、改寫、刪除操作,對 多次相同的操作進(jìn)行合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié) 點(diǎn)上的持久化服務(wù)進(jìn)程。
具體是
1、業(yè)務(wù)節(jié)點(diǎn)上的業(yè)務(wù)邏輯調(diào)用代理層的數(shù)據(jù)接口來訪問某個數(shù)據(jù)表T ;
2、數(shù)據(jù)接口調(diào)用緩存控制邏輯來請求數(shù)據(jù);
3、緩存控制邏輯操作非持久化表的數(shù)據(jù);訪問邏輯直接用Mnesia提供的接 口;對于Mnesia非持久化表來說,Mnesia負(fù)責(zé)在集群中定位和數(shù)據(jù)傳送;
4、數(shù)據(jù)接口返回結(jié)果,業(yè)務(wù)邏輯的數(shù)據(jù)訪問請求完成;
5、當(dāng)非持久化表完成數(shù)據(jù)更改,自動將本次數(shù)據(jù)改動的細(xì)節(jié)發(fā)給對應(yīng)的持久化 策略進(jìn)程;
6、持久化策略進(jìn)程將操作日志記錄在進(jìn)程字典中;
7、當(dāng)記錄的日志序列達(dá)到某個預(yù)設(shè)的個數(shù),或者當(dāng)計(jì)時器到時時,持久化策略 進(jìn)程把操作記錄序列異步發(fā)往持久化服務(wù)進(jìn)程,后者注冊Global名,其在集群中的定位 由Erlang虛擬機(jī)負(fù)責(zé);
8、持久化服務(wù)進(jìn)程接收操作記錄并更新磁盤表。
在這個方案中,緩存表使用Mnesia非持久化表,持久化策略被移動到緩存服務(wù) 中,作為獨(dú)立進(jìn)程和緩存表位于同一個節(jié)點(diǎn)內(nèi);利用Mnesia數(shù)據(jù)庫的事件訂閱服務(wù),持 久化策略可以收到緩存表中數(shù)據(jù)變化的事件,不再需要數(shù)據(jù)接口來做這一個通知;每個 緩存表由1個持久化策略進(jìn)程來處理。這個方案利用Mnesia提供的服務(wù),進(jìn)一步簡化系 統(tǒng)的邏輯。
相對應(yīng)地,本實(shí)施例提供的系統(tǒng)也有所改變,如圖6所示
業(yè)務(wù)邏輯模塊,實(shí)際業(yè)務(wù)邏輯(不屬于本發(fā)明保護(hù)的范圍);
數(shù)據(jù)接口模塊,Erlang模塊,實(shí)現(xiàn)了 Mnesia數(shù)據(jù)庫的接口,業(yè)務(wù)邏輯模塊通過 此模塊訪問系統(tǒng)中的數(shù)據(jù).在非持久化節(jié)點(diǎn)上,此模塊會將最新數(shù)據(jù)更新到本節(jié)點(diǎn)的對應(yīng) Mnesia非持久化表中;
持久化策略Erlang進(jìn)程,每個非持久化表對應(yīng)一個持久化策略進(jìn)程;此進(jìn)程 通過訂閱Mnesia非持久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的增加,改寫,刪除操作,對 多次相同的操作進(jìn)行合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié) 點(diǎn)上的持久化服務(wù)進(jìn)程;
非持久化表,Mnesia內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供 高速的數(shù)據(jù)讀取服務(wù);
持久化服務(wù)模塊,運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù) 操作序列,并將數(shù)據(jù)改動定期寫入Mnesia持久化表;
持久化表,Mnesia磁盤表,存放持久化的數(shù)據(jù)。
實(shí)施例5:
在實(shí)施例4的方案中存在業(yè)務(wù)節(jié)點(diǎn)對遠(yuǎn)程緩存表的訪問,當(dāng)需要每個業(yè)務(wù)節(jié)點(diǎn) 都能最快速訪問緩存表,則可以有以下變化
如圖7所示,在這個方案中,緩存用Mnesia非持久化表實(shí)現(xiàn);每個業(yè)務(wù)節(jié)點(diǎn)自 行在本地加載持久化緩存表的數(shù)據(jù),緩存控制邏輯只操作本節(jié)點(diǎn)的緩存表,其節(jié)點(diǎn)間的 數(shù)據(jù)同步由Mnesia負(fù)責(zé);系統(tǒng)根據(jù)某種策略為此緩存表建立持久化策略進(jìn)程.
由于每個Mnesia緩存表的訪問都發(fā)生在本節(jié)點(diǎn)內(nèi)部,緩存的訪問速度達(dá)到最大 化;但是由于集群數(shù)據(jù)同步交給了 Mnesia數(shù)據(jù)庫,所以在高壓力下此設(shè)計(jì)本身存在性能 隱患,為了解決這個問題,需要在業(yè)務(wù)邏輯內(nèi)對數(shù)據(jù)改寫的頻率做控制。
具體做法可以是業(yè)務(wù)邏輯中做細(xì)粒度的緩存(比如用進(jìn)程字典記錄數(shù)據(jù)及其改 寫狀態(tài)),利用某種時間或空間策略將數(shù)據(jù)改寫請求壓縮和打包(比如設(shè)定改寫X次就將 最終值寫入數(shù)據(jù)代理),降低其頻率,從而減輕底層Mnesia集群同步帶來的壓力.
這種受控的請求會延遲數(shù)據(jù)變化在集群中的同步,使各個節(jié)點(diǎn)中的緩存表數(shù)據(jù) 出現(xiàn)不完全一致的情況,因此這個方案適用于緩存表的一個數(shù)據(jù)記錄不會同時被多個節(jié) 點(diǎn)訪問,或者對其一致性要求不高的情況。在這種情況下此設(shè)計(jì)用各節(jié)點(diǎn)內(nèi)的緩存表提升了緩存訪問性能,用Mnesia的訂閱能力簡化了持久化流程。
實(shí)施例6:
上述的幾種方案可以同時存在于一個系統(tǒng)中,針對緩存數(shù)據(jù)的特征,采用不同 的方案實(shí)現(xiàn)緩存和持久化,才能使系統(tǒng)整體性能最優(yōu)。
針對不同數(shù)據(jù)訪問需求設(shè)計(jì)的數(shù)據(jù)代理層提高了系統(tǒng)數(shù)據(jù)訪問的性能;集成緩 存邏輯降低了系統(tǒng)的維護(hù)成本。
以上對本發(fā)明實(shí)施例所提供的技術(shù)方案進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個 例對本發(fā)明實(shí)施例的原理以及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只適用于幫助理 解本發(fā)明實(shí)施例的原理;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明實(shí)施例,在具 體實(shí)施方式以及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本 發(fā)明的限制。
權(quán)利要求
1.一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征在于所述方法是在業(yè) 務(wù)邏輯和數(shù)據(jù)庫之間設(shè)置代理層,所有對于數(shù)據(jù)庫的操作請求都發(fā)往所述代理層,對數(shù) 據(jù)庫進(jìn)行擴(kuò)展,所述代理層進(jìn)行分析和排序后,再依照某種時間和空間策略對數(shù)據(jù)進(jìn)行 持久化,持久化策略以Erlang進(jìn)程的形式運(yùn)行,持久化以后將數(shù)據(jù)寫入數(shù)據(jù)庫;在所述代理層內(nèi)集合緩存控制邏輯,負(fù)責(zé)一切數(shù)據(jù)緩存的操作。
2.如權(quán)利要求1所述的一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征在 于所述代理層的數(shù)據(jù)接口與業(yè)務(wù)邏輯實(shí)現(xiàn)數(shù)據(jù)的交互,進(jìn)行數(shù)據(jù)的查詢、增加、刪除 和接口的改寫。
3.如權(quán)利要求2所述的一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征 在于所述持久化策略接收數(shù)據(jù)接口模塊對數(shù)據(jù)記錄的操作,對多次相同的操作進(jìn)行合 并,保持不同類型操作間的順序正確,并按照某種時間或空間策略進(jìn)行持久化。
4.如權(quán)利要求3所述的一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征在 于所述緩存的實(shí)現(xiàn)為ETS,所述緩存為節(jié)點(diǎn)內(nèi)緩存,持久化策略記錄操作,并按照某 種時間或空間策略匯總同步給持久數(shù)據(jù)源寫入磁盤。
5.如權(quán)利要求4所述的一種基于Eriang的分布式數(shù)據(jù)緩存和持久化方法,其特征在 于所述緩存為最終一致性緩存,在持久化節(jié)點(diǎn)進(jìn)行同步服務(wù),把磁盤表的變化同步給 各業(yè)務(wù)節(jié)點(diǎn),同步服務(wù)是一個進(jìn)程或進(jìn)程池,同步服務(wù)維護(hù)數(shù)據(jù)記錄的訂閱列表。
6.如權(quán)利要求3所述的一種基于Eriang的分布式數(shù)據(jù)緩存和持久化方法,其特征在 于所述緩存的實(shí)現(xiàn)為集群訪問,持久化策略進(jìn)程把操作記錄序列異步發(fā)往持久化服務(wù) 進(jìn)程,持久化服務(wù)進(jìn)程接收操作記錄并更新磁盤表。
7.如權(quán)利要求2所述的一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征在 于所述緩存控制操作非持久化Mnesia表的數(shù)據(jù),所述持久化策略通過訂閱Mnesia非持 久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的操作,對多次相同的操作進(jìn)行合并,保持不同類 型操作間的順序正確,并按照某種時間或空間策略進(jìn)行持久化。
8.如權(quán)利要求7所述的一種基于Erlang的分布式數(shù)據(jù)緩存和持久化方法,其特征 在于所述緩存的實(shí)現(xiàn)為節(jié)點(diǎn)內(nèi)Mnesia緩存和更新訂閱,緩存用Mnesia非持久化表實(shí) 現(xiàn);每個業(yè)務(wù)節(jié)點(diǎn)自行在本地加載持久化緩存表的數(shù)據(jù),緩存控制邏輯操作本節(jié)點(diǎn)的緩 存表,其節(jié)點(diǎn)間的數(shù)據(jù)同步由Mnesia負(fù)責(zé);系統(tǒng)根據(jù)某種策略為所述緩存表建立持久化 策略進(jìn)程。
9.一種基于Eriang的分布式數(shù)據(jù)緩存和持久化的系統(tǒng),其特征在于所述系統(tǒng)包括業(yè)務(wù)邏輯模塊實(shí)際業(yè)務(wù)邏輯;數(shù)據(jù)接口模塊Erlang模塊,業(yè)務(wù)邏輯模塊通過所述數(shù)據(jù)接口模塊訪問系統(tǒng)中的數(shù) 據(jù),在非持久化節(jié)點(diǎn)上,數(shù)據(jù)接口模塊將最新數(shù)據(jù)更新到本節(jié)點(diǎn)對應(yīng)的非持久化表中;持久化策略Erlang進(jìn)程,接收對數(shù)據(jù)記錄的操作,對多次相同的操作進(jìn)行合并, 保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié)點(diǎn)上的持久化服務(wù)進(jìn)程;非持久化表內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供高速的數(shù)據(jù) 讀取服務(wù);持久化服務(wù)模塊,運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù)操作序列,并將數(shù)據(jù)改動定期寫入持久化表; 持久化表,存放持久化的數(shù)據(jù)。
10. —種基于Erlang的分布式數(shù)據(jù)緩存和持久化的系統(tǒng),其特征在于所述系統(tǒng)包括業(yè)務(wù)邏輯實(shí)際業(yè)務(wù)邏輯;數(shù)據(jù)接口模塊Erlang模塊,業(yè)務(wù)邏輯模塊通過所述數(shù)據(jù)接口模塊訪問系統(tǒng)中的數(shù) 據(jù),在非持久化節(jié)點(diǎn)上,數(shù)據(jù)接口模塊將最新數(shù)據(jù)更新到本節(jié)點(diǎn)的對應(yīng)Mnesia非持久化 表中;持久化策略Eriang進(jìn)程,每個非持久化表對應(yīng)一個持久化策略進(jìn)程,所述進(jìn)程通 過訂閱Mnesia非持久化表的數(shù)據(jù)更新事件來記錄對數(shù)據(jù)的操作,對多次相同的操作進(jìn)行 合并,保持操作的順序,定期將合并后的操作序列發(fā)送至持久化節(jié)點(diǎn)上的持久化服務(wù)進(jìn) 程;非持久化表Mnesia內(nèi)存表,作為節(jié)點(diǎn)內(nèi)數(shù)據(jù)緩存,為本節(jié)點(diǎn)的業(yè)務(wù)邏輯提供高速 的數(shù)據(jù)讀取服務(wù);持久化服務(wù)模塊運(yùn)行在持久化節(jié)點(diǎn)上的服務(wù)進(jìn)程,接收其他節(jié)點(diǎn)發(fā)來的數(shù)據(jù)操作 序列,并將數(shù)據(jù)改動定期寫入Mnesia持久化表; 持久化表Mnesia磁盤表,存放持久化的數(shù)據(jù)。
全文摘要
本發(fā)明涉及網(wǎng)路游戲領(lǐng)域,公開了一種基于Erlang的分布式數(shù)據(jù)緩存和持久化的方法和系統(tǒng)。所述方法為在業(yè)務(wù)邏輯和數(shù)據(jù)庫之間設(shè)置代理層,所有對于數(shù)據(jù)庫的操作請求都發(fā)往所述代理層,代理層進(jìn)行分析和排序后,再依照某種時間和空間策略對數(shù)據(jù)進(jìn)行持久化,持久化策略以Erlang進(jìn)程的形式運(yùn)行,持久化以后將數(shù)據(jù)寫入數(shù)據(jù)庫;在代理層內(nèi)集合緩存控制邏輯,負(fù)責(zé)一切數(shù)據(jù)緩存的操作。本發(fā)明提供的方法大大減少了數(shù)據(jù)同步所占用的資源,提升了系統(tǒng)性能,降低了業(yè)務(wù)邏輯的復(fù)雜度,降低了系統(tǒng)的維護(hù)成本。
文檔編號G06F17/30GK102024032SQ20101056675
公開日2011年4月20日 申請日期2010年11月29日 優(yōu)先權(quán)日2010年11月29日
發(fā)明者吳澤森, 慶亮 申請人:廣州明朝網(wǎng)絡(luò)科技有限公司