專利名稱:用于保持?jǐn)?shù)據(jù)一致性的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及編程模型,更具體地說,涉及用于松耦合應(yīng)用的同步 和異步的面向數(shù)據(jù)編程模型的系統(tǒng)和方法。
背景技術(shù):
在當(dāng)今的web應(yīng)用中,瀏覽器端表示邏輯、服務(wù)器端"商業(yè),,邏 輯以及用于持久數(shù)據(jù)訪問和詢問的邏輯之間的傳統(tǒng)邊界迅速變得模 糊。這種邊界的模糊在所謂的web混用(mash-up)中尤為顯著,所 述web混用通常使用異步("AJAX,,)邏輯在瀏覽器中一同呈現(xiàn)大量 數(shù)據(jù)源和表示組件。目前,必須使用數(shù)據(jù)訪問語言、服務(wù)器端編程模 型和客戶端腳本模型的結(jié)合對所述應(yīng)用編程,這意味著為了在不同層
之間移動,不得不全部重寫程序或者對程序進(jìn)行重大改變。所涉及的 大量語言還意味著不付出艱苦的努力就無法很好地構(gòu)建組件。
發(fā)明內(nèi)容
在此提供一種用于全領(lǐng)域web應(yīng)用以及其它松耦合分布式應(yīng)用 的統(tǒng)一編程模型,即, 一種能夠使用相同的基本編程構(gòu)造來表示應(yīng)用 邏輯、用戶交互作用和應(yīng)用邏輯的模型。除了提供單一的編程方法之 外,所述模型還簡化了分布式web應(yīng)用的構(gòu)建、升級和維護(hù)。
一種被配置為用于建立和升級程序的反應(yīng)器及其方法,包括收 件箱(inbox),該收件箱被配置為用于對用于添加和刪除操作的更新 束(bundle)進(jìn)行排隊(duì)。將應(yīng)用操作配置為用于將預(yù)狀態(tài)與更新束進(jìn) 行比較以基于由更新束提供的添加和刪除來確定激勵狀態(tài)。根據(jù)所述 激勵狀態(tài)得出響應(yīng)狀態(tài)。從反應(yīng)器看來,所述響應(yīng)狀態(tài)是外部可見的。
一種被配置為用于保持?jǐn)?shù)據(jù)一致性的反應(yīng)器及其方法。反應(yīng)器包括收件箱,該收件箱被配置為用于接收更新信息。應(yīng)用操作被配置為 用于將更新信息應(yīng)用于預(yù)狀態(tài)以基于更新信息來確定激勵狀態(tài)。根據(jù) 所述激勵狀態(tài)得出響應(yīng)狀態(tài)。所述響應(yīng)狀態(tài)是從反應(yīng)器看來外部可見 的唯一狀態(tài)。
一種在包括計算機(jī)可讀程序的計算機(jī)可用介質(zhì)上實(shí)現(xiàn)的反應(yīng)器, 其中,所述計算機(jī)可讀程序在計算機(jī)上執(zhí)行時保持分布式網(wǎng)絡(luò)中的數(shù)
據(jù)一致性,所述反應(yīng)器包括收件箱,該收件箱被配置為用于接收更 新信息;應(yīng)用操作,被配置為用于將更新信息應(yīng)用于預(yù)狀態(tài)以基于更 新信息來確定激勵狀態(tài);以及根據(jù)所述激勵狀態(tài)的響應(yīng)狀態(tài)。所述響 應(yīng)狀態(tài)是由分布式網(wǎng)絡(luò)系統(tǒng)中的其它部件從反應(yīng)器看來外部可見的 唯一狀態(tài)。
一種在包括計算機(jī)可讀程序的計算機(jī)可用介質(zhì)上實(shí)現(xiàn)的反應(yīng)器, 其中,所述計算機(jī)可讀程序在計算機(jī)上執(zhí)行時保持分布式網(wǎng)絡(luò)中的數(shù) 據(jù)一致性,所述反應(yīng)器包括根據(jù)至少一個與反應(yīng)器關(guān)聯(lián)的關(guān)系提供的 反應(yīng)器狀態(tài),其中,根據(jù)在分布式網(wǎng)絡(luò)系統(tǒng)中接收的更新信息來修改 所述反應(yīng)器狀態(tài)。至少一個規(guī)則被配置為用于保持?jǐn)?shù)據(jù)一致性,從而 如果一致性被破壞,則反應(yīng)失敗,以致反應(yīng)器狀態(tài)回退到啟動反應(yīng)之 前的狀態(tài)。
一種用于在分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性的方法,包括將更新 信息輸入到反應(yīng)器,以原子方式(atomically )按照任何定單(order) 執(zhí)行在所有涉及的反應(yīng)器中的所有規(guī)則,以便確定所述反應(yīng)器以及反 應(yīng)中的其它反應(yīng)器的響應(yīng)狀態(tài)和未來狀態(tài)中的至少一個,如果至少一 個規(guī)則無法滿足,則以原子方式將所有涉及的反應(yīng)器回退到它們在所 述反應(yīng)之前的各個狀態(tài),如果反應(yīng)中的所有規(guī)則被滿足,則產(chǎn)生用于 其它反應(yīng)器的更新信息,以在整個分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性。
一種被配置為用于保持?jǐn)?shù)據(jù)一致性的系統(tǒng),包括多個反應(yīng)器, 設(shè)置在分布式系統(tǒng)內(nèi),其中,每個反應(yīng)器包括收件箱,被配置為用 于接收更新信息;應(yīng)用操作,被配置為用于將更新信息應(yīng)用于預(yù)狀態(tài) 以基于更新信息確定激勵狀態(tài);以及響應(yīng)狀態(tài),該響應(yīng)狀態(tài)根據(jù)所述激勵狀態(tài)得出。響應(yīng)狀態(tài)是從反應(yīng)器看來外部可見的唯一狀態(tài),其中,
每個反應(yīng)器處于以下兩種情況中的至少一種每個反應(yīng)器異步響應(yīng)于 來自包括該反應(yīng)器本身的其它反應(yīng)器的更新信息;以及每個反應(yīng)器同 步響應(yīng)于從其它反應(yīng)器寫入的數(shù)據(jù)。
通過以下對結(jié)合附圖閱讀的本發(fā)明示例性實(shí)施例的詳細(xì)描述,這 些和其它特征及優(yōu)點(diǎn)將變得清楚。
將參照附圖公開以下對優(yōu)選實(shí)施例的描述中的細(xì)節(jié),在附圖中 圖1是示出根據(jù)本發(fā)明原理的反應(yīng)器的示例性核心語法的示圖; 圖2是示出根據(jù)本發(fā)明原理的可由反應(yīng)器執(zhí)行的示例性重寫規(guī) 則的示圖3是示出根據(jù)本發(fā)明原理的反應(yīng)器的框圖/流程圖4A和圖4B是分別示出根據(jù)本發(fā)明原理的對于其它反應(yīng)器的
異步和同步引用的示圖;以及
圖5是示出根據(jù)本發(fā)明原理的反應(yīng)器的狀態(tài)和過渡的狀態(tài)圖; 圖6是示出根據(jù)本發(fā)明原理的由反應(yīng)器執(zhí)行的操作的框圖/流程
圖;以及
圖7是根據(jù)一示例性實(shí)施例的構(gòu)建反應(yīng)器的與定單無關(guān)的聲明 規(guī)則集合的框圖/流程圖。
具體實(shí)施例方式
提供一種稱為反應(yīng)器模型的簡單和統(tǒng)一的編程模型的內(nèi)核。反應(yīng) 器模型適合建立和升級互聯(lián)網(wǎng)規(guī)模的程序。所述程序表征為松耦合分 布式組件的集合,所述松耦合分布式組件被隨時聚集,以生成復(fù)合應(yīng) 用。
反應(yīng)器包括兩個主要組件可變狀態(tài),其形式為關(guān)系的固定集合; 以及代碼,其形式為datalog樣式的規(guī)則的固定集合。響應(yīng)于外部激 勵來執(zhí)行反應(yīng)器的代碼,所述外部激勵采用嘗試更新反應(yīng)器的狀態(tài)的形式。
如在典型的進(jìn)程演算中那樣,反應(yīng)器模型適應(yīng)分布式的同步執(zhí)行 的進(jìn)程的集合。然而,不同于典型的進(jìn)程演算,可觀察行為是狀態(tài)序 列。類似地,到反應(yīng)器的接口僅僅是它的狀態(tài),而不是消息通道、端 口或方法的集合。此外,同步和異步組件構(gòu)建兩者均是被允許的。在
一實(shí)施例中,datalog樣式的規(guī)則允許按照aspect-like以自然的方式 構(gòu)建分開指定的功能關(guān)注事物,由此簡化了分布式應(yīng)用的構(gòu)建、升級 和維護(hù)。
本發(fā)明的實(shí)施例可采取全硬件實(shí)施例、全軟件實(shí)施例或包括硬件 部件和軟件部件兩者的實(shí)施例的形式。在優(yōu)選實(shí)施例中,以軟件來實(shí) 現(xiàn)本發(fā)明,所述軟件包括但不受限于固件、駐留軟件、微碼等。
此外,本發(fā)明可采取以下形式可從計算機(jī)可用或計算機(jī)可讀介 質(zhì)訪問的計算機(jī)程序產(chǎn)品,其提供由計算機(jī)或任何指令執(zhí)行系統(tǒng)使用 或結(jié)合計算機(jī)或任何指令執(zhí)行系統(tǒng)使用的程序代碼。為了以下的描 述,計算機(jī)可用或計算機(jī)可讀介質(zhì)可以是任何可包括、存儲、交換、 傳播或傳輸程序的裝置,所述程序由指令執(zhí)行系統(tǒng)、設(shè)備或裝置使用, 或者結(jié)合指令執(zhí)行系統(tǒng)、設(shè)備或裝置使用。所述介質(zhì)可以是電、磁、 光、電磁、紅外或半導(dǎo)體系統(tǒng)(或設(shè)備或裝置)或者傳播媒介。計算 機(jī)可讀介質(zhì)的示例包括半導(dǎo)體或固態(tài)存儲器、磁帶、可移除計算機(jī) 盤、隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、剛性磁盤和 光盤。光盤的當(dāng)前示例包括壓縮盤-只讀存儲器(CD-ROM)、壓 縮盤-讀/寫(CD-R/W)和DVD。
適合存儲和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)可包括至少 一個處 理器,所述處理器通過系統(tǒng)總線直接或間接地耦合到存儲器部件。所 述存儲器部件可包括在實(shí)際執(zhí)行程序代碼期間使用的本地存儲器、海 量存儲器以及高速緩沖存儲器,所述高速緩沖存儲器對至少某些程序 代碼提供臨時存儲,以減少在執(zhí)行期間從海量存儲器取回代碼的次 數(shù)??芍苯踊蛲ㄟ^中間的1/0控制器將輸入/輸出或1/0裝置(包括但 不受限于鍵盤、顯示器、指點(diǎn)裝置等)耦合到系統(tǒng)。還可將網(wǎng)絡(luò)適配器耦合到系統(tǒng)以使得數(shù)據(jù)處理系統(tǒng)能夠通過中
裝置。調(diào)制解調(diào)器、有線調(diào)制解調(diào)器和以太網(wǎng)卡僅僅是幾種當(dāng)前可用 的網(wǎng)絡(luò)適配器。
反應(yīng)器模型的介紹反應(yīng)器模型是對以下三篇文獻(xiàn)的主要思想的 綜合和延伸同步語言(參見,例如,N.Halbwachs的"Synchronous programming of reactive systems, a tutorial and commented bibliography" in Tenth International Conference on Computer-Aided Verification, CAV,98 (Vancouver (B.C.) , 1998年6月),LNCS 1427, Spring Verlag ) 、 Datalog(參見,例如,J.D.Ullman的"Database and Knowledge-Base Systems", vol.1, Computer Science Press, 1998, ch.3,該文獻(xiàn)通過引用合并于此)、角色模型(參見,例如,G.Agha 等人的"A Foundation for Actor Computation", Journal of Functional Programming 7,1 ( 1997年1月),1-69)。通過Datalog,我們得 到用于數(shù)據(jù)詢問的可表達(dá)、聲明和容易構(gòu)建的語言。通過同步語言, 我們得到已定義好的"事件"和原子事件處理的概念。通過角色,我們 得到用于動態(tài)創(chuàng)建進(jìn)程和異步進(jìn)程交互作用的單一模型。
反應(yīng)器包括兩個主要組件可變狀態(tài),其形式為關(guān)系的固定集合; 以及代碼,其形式為Datalog樣式的規(guī)則的固定集合。響應(yīng)于外部激 勵來執(zhí)行反應(yīng)器的代碼,所述外部激勵采用嘗試更新反應(yīng)器的狀態(tài)的 形式。當(dāng)發(fā)生激勵時,在反應(yīng)中同步地以原子方式應(yīng)用反應(yīng)器的規(guī)則, 以產(chǎn)生響應(yīng)狀態(tài)。除了確定響應(yīng)狀態(tài)之外,在反應(yīng)中評估規(guī)則會產(chǎn)出 新的反應(yīng)器,或產(chǎn)生當(dāng)前執(zhí)行的反應(yīng)器或其它反應(yīng)器的新的激勵。根 據(jù)本發(fā)明的原理,優(yōu)點(diǎn)在于在后來的反應(yīng)中,異步處理新產(chǎn)生的激 勵。提供一種簡單的機(jī)制以允許反應(yīng)器的集合在合適的時候作為 一個 單位共同反應(yīng),由此提供分布式原子事務(wù)處理的形式。
如在典型的進(jìn)程演算中那樣,根據(jù)本發(fā)明原理的反應(yīng)器模型適應(yīng) 分布式的同步執(zhí)行的進(jìn)程的集合。然而,不同于典型的進(jìn)程演算,該 實(shí)施例包括作為狀態(tài)序列而不是消息序列的可觀察行為。類似地,到反應(yīng)器的接口僅僅是它的狀態(tài)("REST"樣式),而不是消息通道、 端口或方法的集合。根據(jù)具體實(shí)用的實(shí)施例,通過防止可從外部訪問 的反應(yīng)器狀態(tài)中的特定關(guān)系,并允許有數(shù)據(jù)庫樣式的視圖的規(guī)范(其 中,將可公共訪問的狀態(tài)保持為更詳細(xì)的私有狀態(tài)的抽象)來適應(yīng)信
jt隱o
將數(shù)據(jù)用作到組件的接口 ,并將Datalog用作用于定義程序邏輯 的基礎(chǔ)的一個顯著優(yōu)點(diǎn)在于這種組合從允許利用最少的用于控制和 數(shù)據(jù)依賴的關(guān)注或評估定單來構(gòu)建被寫為規(guī)則的分開指定的狀態(tài)更 新這個意義上來說是高度"聲明"的。這種方式適應(yīng)按照aspect-like方 式以自然的方式構(gòu)建將被構(gòu)建的分開指定的功能關(guān)注事物。
根據(jù)本發(fā)明原理提供的反應(yīng)器模型的獨(dú)特之處在于在單一語言 中至少協(xié)調(diào)地組合以下屬性1)數(shù)據(jù)(而不是端口或通道)用作到 組件的接口, 2)利用動態(tài)產(chǎn)生進(jìn)程的能力,在相同的模型中處理同 步和異步交互作用,3)提供表達(dá)的數(shù)據(jù)詢問和轉(zhuǎn)換構(gòu)造,4)提供指 定約束/斷言作為核心語言的自然部分的能力,5)提供分布式原子事 務(wù)處理,6)以aspect-like方式實(shí)現(xiàn)功能的聲明的、數(shù)據(jù)驅(qū)動的組成 規(guī)范。
根據(jù)本發(fā)明的原理,提供一種用于反應(yīng)的分布式應(yīng)用的編程模 型,其具有用于表示、商業(yè)邏輯、數(shù)據(jù)訪問的相同模型,并簡化構(gòu)建、 升級和應(yīng)用維護(hù)。目標(biāo)應(yīng)用包括web應(yīng)用(Web application )、分 布式商業(yè)應(yīng)用、"軟件供應(yīng)鏈,,等。
考慮下面的反應(yīng)器聲明示例1 (定單入口 ( order entrv ) , REST 樣式)
clef OrderEntry = {
(* each order entry consists of an orderid (presumed unique), an iteiuid, and a quantity *)
public orders:(int, int, int), (* log entries have same components as orders *) log: (int, int, int》. log (id, itemidl, qt:y》 <一 orders (id, itemid, qty) , }
這一反應(yīng)器類型聲明定義一類反應(yīng)器,所述反應(yīng)器記錄定單,即,用于在線目錄應(yīng)用。使用稍后描述的機(jī)制來動態(tài)地創(chuàng)建反應(yīng)器實(shí)例。 以反應(yīng)的固定集合來表達(dá)反應(yīng)器的狀態(tài)。這些是值的固定數(shù)量元組的
數(shù)據(jù)庫意義的集合中的關(guān)系。該示例中的每個OrderEntry反應(yīng)器的 狀態(tài)包括兩種關(guān)系,order和log,它們均是整數(shù)值的3元組的集合。 關(guān)系order具有訪問注釋public,這表示可由任何客戶機(jī)來讀取或更 新order的內(nèi)容。通過"更新",意味著可向order添加元組或從order 刪除元組;在該實(shí)施例中沒有其它形式的更新是可行的。關(guān)系log缺 少任何訪問注釋,其在默認(rèn)情況下是私有的,因此,僅可由反應(yīng)器本 身來讀取或更新關(guān)系log。
當(dāng)由反應(yīng)器來處理來自外部資源的更新束時,產(chǎn)生反應(yīng)。更新束 可以是更新的集合,每個更新用于目標(biāo)反應(yīng)器(更新束的目標(biāo)是反應(yīng) 器)的一個公共關(guān)系。每個更新可以是值的元組的一對集合。更新束 或更新信息可包括標(biāo)量或其它類型的更新。在該示例中, 一種集合是 添加集合a+,將添加到關(guān)聯(lián)的關(guān)系的元組的集合;另一種集合是刪除 集合a-,包括將從關(guān)聯(lián)的關(guān)系刪除的元組。在以下的示例中, 一次僅 更新一種關(guān)系,通常僅添加或刪除單個元組。然而,更新束通??筛?新反應(yīng)器的任何公共關(guān)系,并且一次性添加和/或刪除任意數(shù)量的元 組。以下將更加詳細(xì)地討論更新束。
通過將更新束應(yīng)用(apply)于反應(yīng)器的公共關(guān)系來開始反應(yīng)。 在反應(yīng)之前的那些關(guān)系的值將被稱為反應(yīng)器的預(yù)狀態(tài)。將更新束應(yīng)用 于預(yù)狀態(tài)將產(chǎn)生反應(yīng)的激勵狀態(tài)。反應(yīng)的激勵狀態(tài)(在概念上)是反 應(yīng)器的每個公共反應(yīng)的拷貝,其中應(yīng)用來自更新束的相應(yīng)更新。
因此,例如,在OrderEntry的情況下,如果關(guān)系定單包括在反
應(yīng)之前的單個元組(O, 1234, 3),并且通過利用a+= {(1,5667,2)}和a-
應(yīng)用更新束來啟動反應(yīng),則在反應(yīng)開始的定單的激勵值將是關(guān)系{( 0, 1234, 3) , (1, 5567, 2) }。我們將可交替地引用"激勵狀態(tài)下反應(yīng) r的值"和"r的激勵值"。
如果反應(yīng)器不包括規(guī)則,則通過簡單地將激勵狀態(tài)下關(guān)系的值復(fù) 制到反應(yīng)器的相應(yīng)公共關(guān)系來結(jié)束反應(yīng)(我們將引用關(guān)系在反應(yīng)的結(jié)束時的狀態(tài)作為它的響應(yīng)狀態(tài))。因此,在最簡單的形式中,反應(yīng)僅 僅是狀態(tài)更新。然而,多數(shù)關(guān)注的反應(yīng)器將具有一個或多個規(guī)則。
反應(yīng)器規(guī)則可按照Datalog的樣式或其它關(guān)系數(shù)據(jù)庫代碼來寫 成反應(yīng)器規(guī)則;在圖1中示出用于反應(yīng)器和規(guī)則的示例性語法。可讀 取OrderEntry的單個規(guī)則,以便為了確保在反應(yīng)的結(jié)束,除了那 些在反應(yīng)之前已經(jīng)處于log (即,處于log的激勵狀態(tài))中的orderid 之外,log包含任何處于定單的激勵狀態(tài)下的orderid。因此,在反應(yīng) 之前orders={ (0, 1234, 3 ) }并且log={ ( 0, 1234, 3 ) }并且更新束 包含添加集合{(1, 5567, 2)}的情況下,定單的激勵值將等于KO, 1234, 3), (1, 5567, 2)}。當(dāng)規(guī)則評估完成時,反應(yīng)結(jié)束,在這種 情況下產(chǎn)生響應(yīng)狀態(tài),從而log-((O, 1234, 3) , (1, 5567, 2)} 并且orders-{ (0, 1234, 3) , (1, 5667, 2)}。應(yīng)注意在外部 觀察者看來,反應(yīng)是以原子方式發(fā)生的,即,無法從外部觀察到評估 處理的中間狀態(tài),并且直到先前的反應(yīng)完成,才可將另外的更新束應(yīng) 用到反應(yīng)器。
反應(yīng)器規(guī)則的右手邊或主體(body)包括一個或多個主體語句。 在OrderEntry中,只有一個主體語句,形式定單的匹配謂項(xiàng)(id, 一, 一)。匹配謂項(xiàng)基本上是如下模式,其將由該模式(這里為定單)命 名的關(guān)系中的元組的元素的實(shí)例綁定到變量。這里,只有一個命名的 變量,即,id。下劃線是用于唯一的最新變量名的簡寫。對規(guī)則的評 估促使主體語句匹配于定單的每個元組,將依次匹配的每個元組的每 個orderid值綁定到變量id。由于規(guī)則左側(cè)的頭部語句包括與主體語 句相同的變量,所以確保log將包括綁定到在左手邊匹配的id的每個 值??蓪⒁?guī)則中的每個語句當(dāng)作邏輯意義上的謂項(xiàng),因此,邏輯讀取 的OrderEntry的規(guī)則將用于所有orderid的id,如果定單包括id, 則log也包含id。
現(xiàn)在,從上述先前OrderEntry反應(yīng)的結(jié)果開始,考慮按照A+^ 和^={(0,1234,3)}應(yīng)用另一更新束的效果。將通過刪除定單來開始反應(yīng), 產(chǎn)生激勵狀態(tài)orders={(l, 5667, 2)}, log={(0, 1234, 3), (1, 5667,2)}。在刪除之后評估規(guī)則對log沒有凈影響,這是因?yàn)橹挥卸▎沃?的剩余元組已存在于log中。激勵被包括在響應(yīng)中的log的值中。由 于已經(jīng)是這種情況,所以規(guī)則對log沒有影響,我們得到響應(yīng)狀態(tài), 從而orders={ (0, 1234, 3 ) }并且log={ ( 0 ) , (1)}。這一規(guī)則的 效果在于確保log包含在定單中曾經(jīng)看到的每個orderid。如果我們想 要確保log被保持為定單的當(dāng)前值的確切拷貝(這意味著將根本不再 存在 log ),則我們將采用"非"規(guī)則not
log (, id, itemid, qty)<- not orders (id, itemid, qty)。
這一規(guī)
則的效果在于確保如果orderid不存在于定單中,則其也不在log中; 即,其對元組刪除進(jìn)行編碼。盡管對于多數(shù)Datalog語言通常在主體 語句中允許"非,,,但是對規(guī)則的頭部進(jìn)行"非,,處理要少見得多。
OrderEntry的一個顯著方面在于由客戶機(jī)直接更新定單的集 合,而不是由"請求方法"或"請求端口"作為中介。由OrderEntry表 達(dá)的web組件交互作用的"REST (代表狀態(tài)傳送)"樣式通過直接暴 露狀態(tài),而不是通過訪問方法或端口將狀態(tài)封裝(如在"面向服務(wù),,的 樣式中那樣)而使得能夠更加容易地升級web應(yīng)用。
組合對激勵和響應(yīng)狀態(tài)的引用
現(xiàn)在考慮以下的OrderEntry反應(yīng)器的可選形式。
示例2 (定單入口,服務(wù)樣式)
def Nonce = {} defOrderEntry2 = { (* order consists of an item number and a quantity *)
public write orderRequest: (int, mt). (* each pending order consists of a nonce, an item number, and a quantity *) public read pendingOrciers: (ref Nonce, int, int). (* each log entry consists of a nonce *) log: (ref Nonce). (* 1 *) not orderRequest (item, qty) <-
AorderRequest(item, qty). (*2*) pendingOrders (key, item, qty) <-
AorderRequest (item, qty, key = new Nonce. (*3*) log(n) <- pendbgOrders (n,—,J).}
在反應(yīng)器類型的OrderEntry中,系統(tǒng)中活動的所有定單的集合是可通過外部客戶機(jī)進(jìn)行公開地讀和寫的。在上述的可選
OrderEntry2形式中,關(guān)系order-Request意在包括定單入口的集合, 所述定單入口在更新束中作為一個單位被"接收"并按照以下方式在 單個反應(yīng)中被處理newOrder中的每個入口被傳送到關(guān)系 pendingOrders中,以進(jìn)一步處理。當(dāng)pendingOrders入口凈皮創(chuàng)建時, 將唯一的key給予所述pendingOrders以使其區(qū)別于恰巧具有相同 item號碼和數(shù)量的不相關(guān)定單。在適當(dāng)?shù)剡M(jìn)行處理之后,在反應(yīng)結(jié)束 之前刪除定單請求。最后,如OrderEntry的情況那樣,對每個定單 創(chuàng)建長的入口。現(xiàn)在讓我們依次考慮OrderEntry2聲明的每個規(guī)則, 以查看如何實(shí)現(xiàn)所述功能。
規(guī)則(1)的效果在于刪除所有的進(jìn)入定單入口 。語句 八orderRequest (item, qty)中的A是指在應(yīng)用更新束之后的 orderRequest的激勵值,即,orderRequest在反應(yīng)開始的值。相反, 規(guī)則(1)的頭部是指orderRequest的響應(yīng)狀態(tài),即,關(guān)系在反應(yīng)結(jié) 束的期望狀態(tài)。因此,該規(guī)則表述以下事實(shí)在響應(yīng)狀態(tài)中不應(yīng)存在 來自orderRequest的激勵值的元組。規(guī)則僅可引用主體語句中的關(guān)系 的激勵值;其不能引用頭部中的關(guān)系的激勵值。實(shí)際上,其可"讀取,, 激勵值,但是不能"寫入"激勵值。
規(guī)則(2)將orderRequest關(guān)系的內(nèi)容傳送到pendingOrderss 關(guān)系(回憶所述規(guī)則在由規(guī)則主體匹配的元組上執(zhí)行隱含的迭代)。 語句key=new Nonce是使用比較運(yùn)算符定義的基本謂項(xiàng)語句的實(shí)例。 規(guī)則(2)具有兩個主體語句。規(guī)則評估確保每當(dāng)所有的主體語句 被滿足時,規(guī)則的頭部語句被滿足。由于key是自由變量,所以語句 key=new Nonce總是保持并具有將key綁定到類型Nonce的新創(chuàng)建的 反應(yīng)器的值的效果。創(chuàng)建反應(yīng)器產(chǎn)生全局唯一的反應(yīng)器引用。Nonce 是無價值的反應(yīng)器,其僅有的功能在于用作全局唯一值的產(chǎn)生器;將 所述值用作key將是非常方便的。接下來,我們將假設(shè)Nonce反應(yīng)器 類型被預(yù)先定義。最后,如在OrderEntryl中那樣,規(guī)則(3)記錄 所有的進(jìn)入定單。應(yīng)注意規(guī)則評估的結(jié)果對于聲明規(guī)則的定單是不在意的(例如, 規(guī)則是與定單無關(guān)的)。這一特征使得能夠在不需要關(guān)注控制或數(shù)據(jù) 依賴的情況下,通過改變規(guī)則集合來更加容易地更新反應(yīng)器的功能。 應(yīng)注意例如,規(guī)則(3 )在OrderEntry和OrderEntryl中同樣好地 工作,這表示規(guī)則可用于按照"aspect-like"方式指定正交功能"關(guān)注"。
還應(yīng)注意可將規(guī)則(2 )等同地寫為not orderRequest (_,_) <-0=0。由于0-0是總被滿足的語句,所以該規(guī)則具有在評估之后聲明 在orderRequest中沒有元組的效果,即,在反應(yīng)的結(jié)束,其應(yīng)該被簡 單地設(shè)置為空。
記法規(guī)定1 (無條件規(guī)則)。我們將"head clause <-."用作形式 "head-clause <- 0 = O"的無條件規(guī)則的簡寫。在OrderEntry2中, orderRequest用作請求"通道"或"端口 "在其之后立即處理和清除 (刪除)進(jìn)入請求。由于orderRequest被聲明為"公開寫",所以不能 從外部讀取。相反,OrderEntry2反應(yīng)器的可見狀態(tài)是不能公開寫的 pendingOrders的當(dāng)前值。相反,OrderEntry通過允i午客戶才幾直接操 縱它的外部可見狀態(tài)來進(jìn)行操作。由OrderEntry表達(dá)的組件交互作 用的"代表狀態(tài)傳送,,("REST")樣式通過直接暴露狀態(tài),而不是 在"面向服務(wù),,的樣式中經(jīng)由訪問通道/端口/方法將狀態(tài)封裝,而使得 能夠更加容易地升級web應(yīng)用。反應(yīng)器模型的顯著特征在于這兩種樣 式均可被容易地適應(yīng)。
初始化、常數(shù)、預(yù)狀態(tài)引用和反應(yīng)失敗以下的反應(yīng)器定義一類 "cell":想要確切地保留一個值的反應(yīng)器。
示例3 ( Cell)
def Cell = { public val: (int). live:().
(* initializations *) (*1*) live()<-. (*2*) val (0) <- not -live(). (* singleton constraint; if the body is satisfiable, the reaction fails and the reactor rolls back *) (*3*) not live( ) <- val(x), val(y), x < > y. }
16"cell"的實(shí)例包括兩個關(guān)系具有cell的可公開訪問值的公共一 元關(guān)系val,以及私有空(即,布爾值)關(guān)系live。當(dāng)創(chuàng)建反應(yīng)器時, 它的所有關(guān)系最初為空(null)。規(guī)則(1)和(2)共同定義慣用語, 其將允許我們將關(guān)系初始化為非空值。首先,考慮規(guī)則(1)。該規(guī) 則將live定義為常數(shù),這是因?yàn)樗捻憫?yīng)值在每個反應(yīng)結(jié)束時評估為 非空(即,"真")?,F(xiàn)在,考慮規(guī)則(2)。在該規(guī)則中,在對規(guī)則 中的關(guān)系live的引用中的"-"是指關(guān)系的預(yù)狀態(tài),即,在反應(yīng)的開始之 前,并且在應(yīng)用更新束之前所述關(guān)系的值。關(guān)系的預(yù)狀態(tài)值還是在緊 前面的反應(yīng)的結(jié)束時的響應(yīng)值。當(dāng)引用關(guān)系的激勵狀態(tài)時,對關(guān)系的 預(yù)狀態(tài)的引用僅出現(xiàn)在規(guī)則的主體中,而不是它的頭部中。在這兩種 情況下,這相當(dāng)于禁止"對過去的更新"。
在反應(yīng)器初始化之后產(chǎn)生的第一反應(yīng)中,live的預(yù)狀態(tài)值將是空 (即,"假"),因此,規(guī)則(2)將促使val被初始化為包括單個值O。 然而,由于"live"的預(yù)狀態(tài)值在除了其后面的第一個反應(yīng)之后的每個 事務(wù)開始時均為真,所以規(guī)則(2)對于第一個反應(yīng)之后的反應(yīng)沒有 影響,原因在于它的主體將是不被滿足的(即,-live ()將為真,由 此not-live ()將為假)。這表示cell在初始化之后可以被自由地更 新;規(guī)則(2)的形式確保其不會被不經(jīng)意地"重新初始化"為0。
記法規(guī)定2 (初始化和失敗)。我們將假設(shè)每個反應(yīng)器包括下面
的定義
live:().
live ( )<- not live ().
我們還將使用FAIL作為形式not live ()的規(guī)則頭部的簡寫。 根據(jù)這些規(guī)定,以下形式的"初始化聲明,,r: (int, int)init[(l, 2) ; (3, 4)將代表以下的順序聲明
r:(int, int).
r (1, 2) <- not —live().
r (3, 4, )<- not -live( )
考慮cell的規(guī)則(3)。它的主體中的三個語句共同查看"val"是否包括多于一個值,即,其是否是單個值。如果不是,則規(guī)則需要滿
足它的(左手邊)目標(biāo)語句,即,"live"將被設(shè)置為空(假)。然而, 任何這種嘗試與規(guī)則(1)中的謂項(xiàng)live不為空(為真)不一致。當(dāng) 在對于val有非單個值的情況下不存在滿足反應(yīng)器的所有規(guī)則的一致 方式時,反應(yīng)失敗。在這種情況下,響應(yīng)狀態(tài)回復(fù)到預(yù)狀態(tài)的值;這 一行為由此相當(dāng)于在事務(wù)系統(tǒng)中回退。反應(yīng)器模型的一個顯著屬性在 于可按照與表示狀態(tài)更新的規(guī)則精確相同的形式來表示數(shù)據(jù)庫樣式 中的"斷言"和"完整性約束"。應(yīng)注意反應(yīng)會由于除了諸如上述規(guī)則 (3)的不滿足"約束檢查"之外的原因而失敗。還應(yīng)注意到如果發(fā) 生回退,則反應(yīng)中涉及的所有反應(yīng)器回退。這是分布式反應(yīng)的形式并 可在分布式系統(tǒng)上出現(xiàn)。
例如,考慮下面的無條件規(guī)則
val (17) <-. not val (17) <-.
這些規(guī)貝L是不一致的,因?yàn)樗鼈儑L試同時確保val包含和不包含 17,因此,任何包含它們的反應(yīng)將失敗。盡管所述情形看起來不大可 能,但是有可能建立在給定的特定初始條件下(例如,由于程序員的 失誤)無法滿足的更多現(xiàn)實(shí)的規(guī)則,以識別特定邊緣情況。 一種被關(guān) 注的挑戰(zhàn)在于使用程序分析來在統(tǒng)計上檢測可能出現(xiàn)運(yùn)行時間不一 致的時間。然而,應(yīng)注意運(yùn)行時間反應(yīng)失敗的可能性是反應(yīng)器模型 的"特征"而非限制,原因在于其提供用于檢測和管理程序員的說明書 中的固有不一致的通用機(jī)制。
反應(yīng)器類型"cell"的實(shí)例的客戶機(jī)需要例如通過在添加不同值之 前刪除cell的當(dāng)前值來確保它們保持其單個值約束。然而,如果需要, 則"cell"的聲明可通過添加以下的規(guī)則被擴(kuò)展,以使得希望更新其值 的客戶機(jī)能夠更容易地避免不得不刪除先前值
not val (x)<- -val (x),Aval x < > x'
這一規(guī)則受關(guān)注是因?yàn)樗迷诖擞懻摰乃腥齻€反應(yīng)器狀態(tài) 預(yù)狀態(tài)、激勵狀態(tài)和響應(yīng)狀態(tài)。規(guī)則的主體查看val的激勵值是否包含不同于預(yù)狀態(tài)的項(xiàng)。如果包含,則從val的響應(yīng)值刪除不好的預(yù)狀 態(tài)項(xiàng)。然而,應(yīng)注意如果客戶機(jī)嘗試將多于一個區(qū)別插入單個更新 束,則單個值約束仍可能失敗。該示例示出反應(yīng)器規(guī)則的聲明特性如 何使其通過以非打擾的方式添加新的特征來直接對現(xiàn)有功能"逐漸提 煉"。
異步到目前為止,僅解釋了當(dāng)應(yīng)用更新束時反應(yīng)器如何反應(yīng)。 現(xiàn)在,我們描述如何產(chǎn)生更新(例如,更新束),并解釋該處理如何 密切地連接到異步交互作用。考慮以下的示例,該示例計算Fibonacci 序列的連續(xù)值
示例4 (自反應(yīng)Fibonacci)
def Fibonacci = ■{ (* complete series thus far; first element is index, second element is value *)
public read series: (int, int) init [ (l,O); (2,1)〗, (* must be true for computation to take place *^ public write run: ( ) init [()). temporary relation holding all indices in the sequence less than the maximum *) ephemeral notLargest: (int). (* compute indices in "series" less than max *) notLargest (n) <-
series (n, — ), series (n,, —), n, > n. (* next "series" value computed from current values *) —2" series A(n, xl+x2) <-not notLargest (n),
series (n-l, xl), series (n, x2). (* halts computation if "run" set to false *)
—3*) FAIL <-not -run (), not Aruti(). }_
關(guān)系序列包括元素對,其第一元素是序列值的順序位置,其第二 元素是序列的相應(yīng)值。為了計算序列的下一元素,我們需要首先識別 到目前為止計算的序列的最后兩個元素。需要全稱量詞化來確定序列
的最大元素;然而,Datalog規(guī)則的主體本質(zhì)上僅可對現(xiàn)存屬性進(jìn)行 編碼。為了計算全稱屬性,我們通常需要輔助關(guān)系。這里,我們使用 短暫或"臨時"關(guān)系notLargest,其用于包括少于最大索引的序列的元 素的所有索引。短暫關(guān)系在反應(yīng)之間不持久,即,它在反應(yīng)結(jié)束時的 值不被"寫回"以參與未來的反應(yīng)。然而,短暫關(guān)系通常可以是公開的,這允許通過更新束(它的初始值否則為空)來對其進(jìn)行初始化。規(guī)則
(1)使用在匹配語句中嵌入的表達(dá)式的以下簡寫來定義notLargest 的內(nèi)容。
記法規(guī)定3。形式的規(guī)則
rl (exp。》 < i (e叩^….,其中,expi是圖i中的非終止符Exp
的實(shí)例,并且是以下項(xiàng)的簡寫
rl(x0) <- ...ri (xi). … ,x0 - exp0 , . . ,,xi = expi .
其中,xi是所有的最新變量。
規(guī)則(2)根據(jù)按照上述方式先前計算的值來計算Fibonacci序 列的下一值。然而,應(yīng)注意該規(guī)則的頭部中的關(guān)系具有形式seriesA。 這一形式的關(guān)系名稱是指關(guān)系的未來狀態(tài)。未來狀態(tài)定義在隨后的反 應(yīng)中在當(dāng)前反應(yīng)結(jié)束之后處理的更新束的內(nèi)容。因此,可將關(guān)系的未 來值看作用于定義異步更新或分派"消息"。作為引用序列的未來值的 結(jié)果,當(dāng)序列的連續(xù)值被添加到列表時,所述序列的連續(xù)值對于外部 觀察者而言分別可見。用于引用反應(yīng)的激勵值(例如, (x))和反應(yīng) 的未來值(例如,rA(s))的對稱寫法意在強(qiáng)調(diào)它們的補(bǔ)充作用未來 值引用產(chǎn)生更新束,激勵值引用產(chǎn)生關(guān)系在已經(jīng)應(yīng)用更新束之后的 值。
Fibonacci的規(guī)則(3)添加最后的特征停止計算序列的能力。 如果run的預(yù)狀態(tài)和激勵值均為假,則規(guī)則導(dǎo)致失敗,由此防止產(chǎn)生 對序列的進(jìn)一步更新。應(yīng)注意該規(guī)則不會防止run本身的狀態(tài)被客 戶機(jī)改變。
Fibonacci的實(shí)例可對兩個不同類的更新束作出反應(yīng)在內(nèi)部產(chǎn) 生的具有序列的新值的更新束,和客戶機(jī)產(chǎn)生的影響run的值的更新 束。由于"序列"不是公開的,所以客戶機(jī)不能更新"序列"。Fibonacci 反應(yīng)器不會產(chǎn)生影響"run"的值的更新束,原因在于其沒有引用"run" 的未來值的規(guī)則。因此,更新束將包含對"序列,,或"run"的更新,但 是不包含對這兩者的更新。
通常,不同的反應(yīng)器同時獨(dú)立地操作(盡管多個反應(yīng)器可在特定情況下作為一個單位作出反應(yīng))。根據(jù)這一事實(shí),多個"源"反應(yīng)器可
產(chǎn)生定義用于相同"目標(biāo)"反應(yīng)器的更新束的更新束。在Fibonacci反 應(yīng)器實(shí)例的情況下,可在所述實(shí)例的先前反應(yīng)正在進(jìn)行的同時,由客 戶機(jī)通過嘗試更新"run"的值來產(chǎn)生更新束。由于反應(yīng)以原子方式發(fā) 生,所以將未決客戶機(jī)更新排隊(duì),直到先前反應(yīng)完成。為此,每個反 應(yīng)器具有相關(guān)的收件箱隊(duì)列,其包括未決更新束(或其它更新信息) 的多個集合。當(dāng)反應(yīng)完成時,反應(yīng)器檢查新的更新束的存在。如果在 隊(duì)列中存在一個新的更新束,則使其出列并啟動反應(yīng)。如果不存在新 的更新束,則反應(yīng)器是靜止的,直到新的更新到達(dá)。應(yīng)該公平地執(zhí)行 處理收件箱的項(xiàng)(更新束)的定單。
根據(jù)對目標(biāo)為Fibonacci實(shí)例的更新束作出反應(yīng)的定單,可多于 一次地產(chǎn)生序列的相同元素。這不會有問題,因?yàn)槎嘤谝淮蔚貙⑾嗤?的序列元素添加到相同的關(guān)系不具有有效影響。然而,可按照這種方 式來重寫Fibonacci,以確保序列的每個元素確切地產(chǎn)生一次。
盡管將Fibonacci設(shè)計為使得更新束每次僅可更新一個關(guān)系,但 是更新束通常包括對于多于一個關(guān)系的更新??紤]例如想要更新服務(wù) 器上保持的定單的樹(例如,XML樹)的客戶機(jī)??墒褂霉?jié)點(diǎn)上的 兩種關(guān)系來保持定單的樹父子關(guān)系、下一同胞關(guān)系。在這種情況下, 更新很自然地影響這兩種關(guān)系。
反應(yīng)器引用和異步交互作用到目前為止,我們的示例僅考慮了 單個反應(yīng)器類型(除了 Nonce的無價值情況)。現(xiàn)考慮以下的示例。
示例5 (異步詢問/響應(yīng))def Sample = { (* reactor reference to sensor; assumed to be
initialized by client public rSensor: (ref Sensor). (* samples collect thus far; uses nonce to distinguish multiple measurements of the same sample *) public log: (ref Nonce, int) (* "ports" for interaction *) public write ephemeral pulse:(). public write ephemeral response: (int). (* dispatch request for alue,, when "pulse" set *) (*1*) s.requestA(self) <- Apulse (), rSensor(s). (* process response by adding sample to log *) 〖*2*) log(new Nonce, r) <- ^response (r). } def Sensor = { public write ephemeral request: (ref Sample), public val: (int).
dispatch response when client sets "request" *) r.response A(v) <- value (v),八request (r),
(* singleton constraint " FAIL <- val(x) <val(y), x y. }
反應(yīng)器類型"Sample (樣本)"和"Sensor (傳感器)"對"典型"
的異步請求/響應(yīng)相互作用進(jìn)行編碼。為了使得兩個反應(yīng)器實(shí)例能夠通 信,我們使用諸如存儲在關(guān)系rSensor中的反應(yīng)器引用。"樣本"的規(guī) 則(1)的效果在于當(dāng)"樣本"的客戶機(jī)更新pulse時,分派對于由"傳 感器,,保持的當(dāng)前值的異步請求。規(guī)則(1)中的表達(dá)式s,requestA(self) 包括對關(guān)系rSensor的間接引用首先,存儲在關(guān)系rSensor中的反 應(yīng)器引用被綁定到變量s,然后,我們使用表達(dá)式s.request間接引用 傳感器實(shí)例的關(guān)系"請求",由于我們引用s.request的未來值,所以異 步更新束被分派到包含對請求器實(shí)例的自引用的傳感器實(shí)例,所述請 求器實(shí)例由自身構(gòu)造產(chǎn)生。
傳感器實(shí)例通過經(jīng)由請求器設(shè)置的反應(yīng)器引用間接地設(shè)置響應(yīng) 關(guān)系來分派傳感器的當(dāng)前值,從而對請求作出響應(yīng)。由于r.responseA 引用未來值,所以響應(yīng)是異步的。請求器通過用響應(yīng)的值來更新log 來類似地處理來自傳感器實(shí)例的響應(yīng)。應(yīng)注意"樣本"的規(guī)則(2)具有多個頭部;其僅僅是單獨(dú)規(guī)則 的簡寫,每一個具有一個頭部,多個頭部共享相同的主體。
為了示例樣本和傳感器實(shí)例并將它們連接到 一起,另 一反應(yīng)器包 括以下形式的規(guī)則
s.rSensor (d) <畫s=new Sample, d= new Sensor
這一規(guī)則創(chuàng)建了樣本和傳感器兩者的實(shí)例,并更新產(chǎn)生的樣本實(shí) 例的rSensor關(guān)系,以指向傳感器實(shí)例。樣本與傳感器實(shí)例之間的請 求-響應(yīng)循環(huán)需要三種不同的反應(yīng)樣本客戶機(jī)設(shè)置pulse (其將請 求分派到傳感器)的反應(yīng)、傳感器對所述請求作出響應(yīng)的反應(yīng)、以及 請求器更新log的值的反應(yīng)。
復(fù)合同步響應(yīng)在示例5中,兩個反應(yīng)器實(shí)例異步地相互作用。 現(xiàn)在考慮示例6。
示例6 (典型事務(wù))
def Acct = ■{ public balance: (int). (* singleton constraint on balance *) FAIL <- balance (x), balance (y), x y.
negative balances not allowed FAIL <-balance (x), x < 0. }
def Minibank = {
(* request consists of transfer amt, to account, from account" public write ephemeral transferReq: (int, ref Acct, ref Acct). to.balance (x+amt), not to,bai咖e (x) <-
AtransferReq (amt, to, _), to.balance (x). from.balance (y-amt), not from.balance (y) <-、加sferReq (amt, _, from), not from,Gal加ce (y). }
在示例6中,小型銀行的實(shí)例接收用于在帳戶之間轉(zhuǎn)移錢財?shù)漠?步請求。如示例5所示,我們使用引用使反應(yīng)器一起是"垂直的"。 然而,應(yīng)注意對兩個帳戶的收支差額關(guān)系的引用會引用它們的響應(yīng)
值,而不是它們的未來值,例如,我們4吏用to' , balance (x+amt〉而 不是balanceA(x+amt)。這表示如果在小型4艮行的實(shí)例中,由具有新 的請求元組的更新束啟動反應(yīng),則反應(yīng)器的范圍將延伸到包括兩個帳戶反應(yīng)器(分別通過變量向外和向內(nèi)引用)。這將產(chǎn)生涉及三個反應(yīng) 器實(shí)例的復(fù)合的、同步的、原子的反應(yīng)。范圍延伸是固有的動態(tài)處理,
類似于分布式事務(wù)每當(dāng)間接關(guān)系引用被寫入時,反應(yīng)的范圍延伸到 包括受影響的反應(yīng)器。以下將描述范圍延伸處理的細(xì)節(jié)。
應(yīng)注意規(guī)則Acct (帳戶)對關(guān)于收支差額的可允許值的約束 進(jìn)行編碼。在復(fù)合反應(yīng)中,必須滿足所有涉及的反應(yīng)器的所有規(guī)則, 以便反應(yīng)能夠成功。如果任何規(guī)則失敗,則復(fù)合反應(yīng)失敗,所有的反 應(yīng)器回復(fù)到它們的預(yù)反應(yīng)狀態(tài)。復(fù)合反應(yīng)總是在單個啟動站點(diǎn)被啟 動,在反應(yīng)器實(shí)例中,某些異步產(chǎn)生的更新束被處理。在示例6的情 況下,復(fù)合反應(yīng)在小型銀行實(shí)例中總是被啟動。
復(fù)合反應(yīng)中涉及的反應(yīng)器可分開定義相同反應(yīng)器實(shí)例的關(guān)系的 未來值。在這種情況下,組合了所有涉及的反應(yīng)器的復(fù)合未來值更新 的單個更新束在復(fù)合反應(yīng)結(jié)束時被分派到每個目標(biāo)反應(yīng)器。從這個意 義上來說,在外部觀察者看來,復(fù)合反應(yīng)具有與涉及單個反應(yīng)器的反 應(yīng)相同的原子屬性。
復(fù)合反應(yīng)以及用戶接口部件示例7中示出某種程度上更加完整
的示例,以下示出可如何基于關(guān)聯(lián)的數(shù)據(jù)庫的當(dāng)前內(nèi)容動態(tài)地例化
(instantiate)多個用戶接口部件。這;f莫擬建立動態(tài)的、數(shù)據(jù)驅(qū)動的 用戶接口部件的處理。
示例7 (數(shù)據(jù)驅(qū)動的UI)def ButtonWidget - { public label: (string), public write ephemeral pressed:(). FAIL <- label (x), label (y), x < > y, } def OutputWidget = { public label: (string), public val: (string). FAIL <- label (x), label (y), x o y. FAIL <- val (x), val (y), x <> y. } def DataDisplay = { (* database: entry is (itemid, qty) pair *)
public db: (int, int) (* list of button / output widget pairs, indexed by itemid " widgets: (int,ref ButtonWidget, ref OutputWidg改). (* labels of widgets are constants *)
o.label ("Inventory: ',) 〈-widgets (_, 一,。), (*2*) b.label ("Click to decrement") <- — widgets (_, b, 一 ) (* projection of relations onto their itemids *) ephemeral childltemsPrev: (int). ephemeral dbltems: (int). (*3*) childltemsPrev (i) <- -widgets (i,—,—). (*4*) dbltems (i) <- db (i, _). ——
(* add new child widget if new item added to db " (*5*) children (i' new ButtonWidget, new OutputWidget) <-db (i, _), not in chi,dltemsPrev (i). (* delete widgets if corresponding item removed from db *) (*6*) not widgets (i, 一, 一 ) <_
-widgets (i,」—X not dbltems (i).
(* output value set to qty of corresponding item *) o.val (toString (q)),加to.val(s) <-widgets (i, 一, o), db (i, q), -o.val(s), (* button increments qty of corresponding item *) (*8*) db(i,q-l),notdb(i,q) <-
-db (i, q), widgets (i, b, _ ), b.pressed (). }
DataDisplay的基本構(gòu)思在于為數(shù)據(jù)庫中的每個項(xiàng)產(chǎn)生按鈕和輸 出字段。ButtonWidget和OutputWidget是可重復(fù)使用的用戶接口部 件,其代表為關(guān)系db中的每個項(xiàng)產(chǎn)生的按鈕和輸出字段。如此產(chǎn)生 的按鈕是"活動,,的按下它們將促使關(guān)聯(lián)的數(shù)據(jù)被減少,這又將導(dǎo)致 對用戶接口 (UI)的更新。
規(guī)則(1) 、 (2) 、 (3)和(5)共同為db中的每個項(xiàng)創(chuàng)建新 的widget。規(guī)則(1)和(2)初始化用于widget的標(biāo)簽。盡管用于ButtonWidget和OutputWidget的規(guī)則是簡單的約束,但是我們注意 到用于新創(chuàng)建的反應(yīng)器的規(guī)則被評估為創(chuàng)建它們的"父"反應(yīng)器的一 部分。規(guī)則(7)將輸出字段的值設(shè)置到當(dāng)前保存在數(shù)據(jù)庫中的數(shù)量 的值。規(guī)則(8)將相應(yīng)按鈕和數(shù)據(jù)庫項(xiàng)"接線,,到一起,從而當(dāng)按鈕 被按下時,相應(yīng)的數(shù)據(jù)項(xiàng)被增加。
參照圖2,示出了根據(jù)一示例性實(shí)施例的示出反應(yīng)器的核心語法 的程序代碼。反應(yīng)器包括關(guān)系和規(guī)則,并且可被分類為分布的反應(yīng)的、 單線程的、狀態(tài)化的單元。注意到以下內(nèi)容即足夠反應(yīng)器的規(guī)則可 引用反應(yīng)器本身的關(guān)系(本地關(guān)系)和其它反應(yīng)器的關(guān)系(遠(yuǎn)程關(guān)系), 兩種關(guān)系均處于主體和頭部中。在概念上,規(guī)則讀取出現(xiàn)在主體中的 所有關(guān)系以及以非的形式出現(xiàn)在頭部中的任何關(guān)系。因此,可在統(tǒng)計 上確定規(guī)則對于讀取訪問的需要。盡管在實(shí)際中,在清楚主體無法匹 配任何元組之后,將不再讀取附加關(guān)系。通常僅可在運(yùn)行時間確定規(guī) 則是否將在被評估時寫入頭部關(guān)系,原因在于讀取要匹配于滿足主體 進(jìn)行寫入發(fā)生的事實(shí)的非空集合。為此,我們將使用術(shù)語"讀取 (read)"來引用靜態(tài)屬性,而不考慮任何可避免不必要讀取的優(yōu)化。 另一方面,術(shù)語"寫入(write)"將嚴(yán)格地保留為用于動態(tài)屬性,即, 僅當(dāng)主體在被評估時產(chǎn)生至少 一個匹配時,頭部關(guān)系被認(rèn)為將被寫 入。
關(guān)系和枚舉關(guān)系是元組的集合(n, ..., rn),其中,每個ri 是類型整型、字符、枚舉類型名稱、ref名稱之一?;绢愋途哂型?常的含義。以下描述反應(yīng)器引用、ref名稱。當(dāng)反應(yīng)器被例化時,關(guān) 系為空。當(dāng)元組x出現(xiàn)在關(guān)系r中時,我們說r (x)是一個事實(shí)。枚 舉引入在約束的有限集合上的一種新排列(即,空類型的約束)。例 如,enum season={Spring, Winter, Summer, Fall》引入具有四個常量 類型的季節(jié)。
除了在反應(yīng)之間持久不變的規(guī)律關(guān)系之外,反應(yīng)器可聲明短暫的 關(guān)系。這些關(guān)系可按照與規(guī)律關(guān)系精確相同的方式從內(nèi)部和外部寫入 和讀取,但是它們在關(guān)系之間不持久。反應(yīng)當(dāng)反應(yīng)器接收到更新束時,反應(yīng)開始。更新束可以是從接
受方的公開關(guān)系名稱到集合對(A+, A)的總映射,其中,A+和A是 分別從所述關(guān)系添加和刪除的元組的集合,并且A+門A-更新束
應(yīng)該包括至少一個非空集合,即,完全空的更新束不能很好地形成。
反應(yīng)器在接收到更新束之前的狀態(tài)稱為預(yù)狀態(tài)。將更新束應(yīng)用于 反應(yīng)器的預(yù)狀態(tài),結(jié)果產(chǎn)生激勵狀態(tài)。此外,反應(yīng)可產(chǎn)生某些未來狀 態(tài)的更新,這些更新形成啟動后來的反應(yīng)的更新束。響應(yīng)于更新束, 反應(yīng)器評估它的所有規(guī)則,當(dāng)進(jìn)行所述評估時,其可將反應(yīng)的范圍延
伸到包括其它反應(yīng)器??砂凑找韵聝煞N方式進(jìn)行延伸l.當(dāng)新的反應(yīng) 器被例化時,將其包括在促使其被例化的反應(yīng)的范圍中。2.當(dāng)任何關(guān) 系(本地或遠(yuǎn)程)的響應(yīng)狀態(tài)被寫入時,將包括所述關(guān)系的反應(yīng)器以 及包括讀取所述關(guān)系的規(guī)則的所有反應(yīng)器包括在正在進(jìn)行的反應(yīng)的 范圍中。每當(dāng)規(guī)則產(chǎn)生用于所述關(guān)系的響應(yīng)狀態(tài)更新時,我們就說關(guān) 系被寫入,而不考慮其是否產(chǎn)生狀態(tài)改變(例如,添加已經(jīng)存在的元 組會構(gòu)成寫入)。
被動讀取是一例外。被動讀取是指從遠(yuǎn)程關(guān)系的預(yù)狀態(tài)讀取。被 動讀取與其它遠(yuǎn)程讀取的區(qū)別在于寫入關(guān)系自身將不會造成反應(yīng)延 伸到閱讀器。當(dāng)包括在反應(yīng)中的所有反應(yīng)器已到達(dá)滿足它們的規(guī)則的 狀態(tài),或者已存在沖突(見下)并且所有涉及的反應(yīng)器回復(fù)(回退) 到它們的預(yù)狀態(tài)(即,在更新束發(fā)生之前或所述反應(yīng)器被包括在反應(yīng) 中之前所處的狀態(tài)),所述反應(yīng)完成。以下描述反應(yīng)的事務(wù)屬性。
如上所述,當(dāng)關(guān)系寫入任何本地或遠(yuǎn)程關(guān)系的未來狀態(tài)時會產(chǎn)生 一個或多個新的更新束。反應(yīng)可產(chǎn)生許多更新束,但是在一實(shí)施例中, 其對于每個接收者可僅產(chǎn)生一個更新束。如果若干不同的有關(guān)反應(yīng)器
對于相同的接收者產(chǎn)生更新束,則更新將被組合為一個更新束。在反 應(yīng)回退的情況下,不產(chǎn)生更新束。如果反應(yīng)更新反應(yīng)器d, ..., Cn 的未來狀態(tài),則其產(chǎn)生n個不同的更新束,并且每個Ci將具有對于它 自己的更新束而言分開且獨(dú)立的反應(yīng)。即使Ci的反應(yīng)的范圍碰巧擴(kuò)展 到包括某些其它的Cj, Cj的更新束也不會在所述反應(yīng)中被處理(或者甚至不會被看到)。
可將反應(yīng)器的外部可見壽命循環(huán)示為一系列響應(yīng)狀態(tài) 實(shí)例化和反應(yīng) 更新i 更新2
畫>響應(yīng)o -> 響應(yīng)i- >.. 術(shù)語預(yù)狀態(tài)、激勵狀態(tài)、響應(yīng)狀態(tài)和未來狀態(tài)僅相對于特定反應(yīng)
有意義,這是因?yàn)橐粋€反應(yīng)的響應(yīng)狀態(tài)是下一反應(yīng)的預(yù)狀態(tài);并且一 個反應(yīng)的未來狀態(tài)分裂成為 一個或多個后續(xù)反應(yīng)的激勵狀態(tài)。反應(yīng)器 的規(guī)則可通過程序引用所有四種狀態(tài)其可讀取預(yù)狀態(tài)、激勵狀態(tài)和 響應(yīng)狀態(tài);其可寫入響應(yīng)狀態(tài)和未來狀態(tài)。
當(dāng)反應(yīng)器響應(yīng)于更新束而開始反應(yīng)時,它的預(yù)狀態(tài)和激勵狀態(tài)將 通常變得不同(除非應(yīng)用更新束不產(chǎn)生改變),原因在于更新束的內(nèi) 容反應(yīng)在激勵狀態(tài)中。如果反應(yīng)范圍延伸到(或影響)其它反應(yīng)器, 然而,它們的預(yù)狀態(tài)和激勵狀態(tài)將相同。
動態(tài)反應(yīng)器創(chuàng)建存在幾種引入對反應(yīng)器的引用的方式。關(guān)鍵字 "自我"在用于規(guī)則中時,用于評估對包含的反應(yīng)器的引用。表達(dá)式new reactor-type-name用于例化給定類型的新反應(yīng)器,將當(dāng)前反應(yīng)延伸為 包括所述新反應(yīng)器,并評估到所述新反應(yīng)器中的引用。
反應(yīng)器引用是可被讀取,寫入和比較的總定單值??偠▎问菢?biāo)準(zhǔn) Datalog要求,以允許域上的聚合函數(shù)(計數(shù),求和等)。
沖突和回退反應(yīng)是所有參與反應(yīng)器的所有規(guī)則的評估。結(jié)果, 規(guī)則對(涉及的反應(yīng)器的)響應(yīng)狀態(tài)和(任意反應(yīng)器的)未來狀態(tài)產(chǎn) 生添加和刪除。如果對于任何持久或短暫的反應(yīng),對于添加和刪除兩 者記錄相同的元組,則存在沖突。更具體地說,假設(shè)具有持久關(guān)系
r"…,rn和短暫關(guān)系(臨時) rn+i, …,rn+m 的反應(yīng)器,反應(yīng)對于每
個關(guān)系產(chǎn)生將被添加的元組集合和將被刪除的元組集合。我們將這些
分別表示為 以及 Z一 ) …9 T A_ 。類似地,對于未來狀態(tài),
—1 -w+ml -l -w+wl
我們將其表示為,",…,,r以及"r,…,r,。
如果對于任何i, ,n/-一,或者對于任何j, /^+r> A、—則存
一/ 一/ — 一
在沖突。應(yīng)注意響應(yīng)狀態(tài)與未來狀態(tài)之間的不一致不會引起沖突。此外,應(yīng)注意到短暫關(guān)系即使不持久,也仍舊遵循一致性檢查。
如果存在沖突,則所有參與反應(yīng)器回復(fù)到它們的預(yù)狀態(tài),并且不 分派更新束。如果沒有檢測到?jīng)_突,則應(yīng)用對于響應(yīng)狀態(tài)的添加和刪 除,并且分派對于未來狀態(tài)的添加和刪除作為更新束。
鎖定和反應(yīng)當(dāng)反應(yīng)擴(kuò)展到包括幾個反應(yīng)器時,復(fù)合反應(yīng)應(yīng)按照 與具有一個反應(yīng)器的反應(yīng)出現(xiàn)的相同方式表現(xiàn)為一個原子過渡中。以 下的鎖定規(guī)定確保這一屬性。
反應(yīng)器當(dāng)同意對更新束作出反應(yīng)時進(jìn)行鎖定,并且在反應(yīng)的持續(xù) 期間保持鎖定狀態(tài),直到發(fā)現(xiàn)或提交響應(yīng)狀態(tài),或者沖突促使反應(yīng)器 回退到預(yù)狀態(tài)。當(dāng)反應(yīng)器被鎖定時,其拒絕與不是相同反應(yīng)的一部分 的反應(yīng)器的任何交互作用(包括讀取訪問、寫入訪問以及開始對其它 更新束作出反應(yīng))。
簡言之,我們可觀察到如果反應(yīng)器被鎖定,則該反應(yīng)器被包括 在正在進(jìn)行的反應(yīng)中,或者所述反應(yīng)器的至少一個關(guān)系已經(jīng)或?qū)⒁?正在進(jìn)行的反應(yīng)中的另一反應(yīng)器讀取。反之并不總是如此,這是因?yàn)?正在進(jìn)行的反應(yīng)可能需要讀取反應(yīng)器,但是仍未鎖定。這種情況很容 易發(fā)生,例如,如果反應(yīng)器忙于服務(wù)于其它請求。直觀地,反應(yīng)范圍 擴(kuò)展到包括所有擁有或(非被動地)讀取正在寫入的關(guān)系的反應(yīng)器, 同時,鎖定動態(tài)地擴(kuò)展到包括所有擁有正在讀取的關(guān)系的反應(yīng)器(以 及所有在所述反應(yīng)范圍中的反應(yīng)器)。
當(dāng)遠(yuǎn)程反應(yīng)器被讀取時,需要對于反應(yīng)器的專門加鎖,并在反應(yīng) 的整個持續(xù)期間保持鎖定。假如稍后需要在相同的反應(yīng)中寫入相同的 遠(yuǎn)程反應(yīng)器,則所述極其具有保護(hù)作用的鎖定策略保證對遠(yuǎn)程反應(yīng)器 的預(yù)狀態(tài)和響應(yīng)狀態(tài)的引用將實(shí)際上引用所述反應(yīng)器的兩個連續(xù)狀 態(tài),這是因?yàn)槠渖形幢会尫乓酝瑫r服務(wù)于任何其它反應(yīng)。在這種設(shè)置 中很自然地出現(xiàn)死鎖的問題,將在下面來討論這一問題。
反應(yīng)器的任何實(shí)施應(yīng)該保證以上概括的語義,但是可進(jìn)行幾種優(yōu) 化。首先,基于類型的靜態(tài)依賴檢查可在許多情況下確定讀取的反應(yīng) 器是否從未被寫入反應(yīng)中。在這種情況下,讀取的鎖定可在完成時立即被解除,或者如果給予反應(yīng)器助手線程來服務(wù)于閱讀器,則甚至可 同時允許幾個閱讀器。其次,優(yōu)化策略可避免在讀取完成之后保持讀
取鎖定,而是簡單地檢查沒有發(fā)生其它的干擾寫入,反應(yīng)需要寫入遠(yuǎn)
程反應(yīng)器。
規(guī)則可讀取規(guī)則聲明"用于以下元組的每個組合,所述元組匹
配主體,將由頭部語句命令的更新要求添加到由頭部語句識別的狀
態(tài)"。我們發(fā)現(xiàn)Datalog規(guī)則是一種方便的用于指定規(guī)則的一個概念
的方式。其它語言和規(guī)則集合也可被理解。標(biāo)準(zhǔn)Datalog程序(即,
普通程序)允許主體語句中的"非"。對于具有算術(shù)的標(biāo)準(zhǔn)Datalog的
總體概述參見以上引用的Ullman的文章。為了全面支持一類目標(biāo)應(yīng)
用以及目前提供的方式,需要對標(biāo)準(zhǔn)Datalog施加以下條件(i)頭
部語句中的"非"(為了表示刪除);(ii)狀態(tài)更新(從規(guī)則評估清
楚分離的連續(xù)可觀察狀態(tài));(iii)反應(yīng)器引用;(iv)在非的頭部 語句中的非綁定變量。
頭部語句中的非可將在同步執(zhí)行的反應(yīng)器集合中刪除和添加持
久關(guān)系ri的響應(yīng)狀態(tài)看作兩步處理(l)作為應(yīng)用標(biāo)準(zhǔn)Datalog技術(shù) 的結(jié)果創(chuàng)建一對關(guān)系(,,A),其包括將被添加到ri或從n刪除的
一/ 一/
元組的集合,然后(2)在Datalog框架的外部,重寫ri的響應(yīng)狀態(tài)以 包括卞,并排除<-。相同的構(gòu)思應(yīng)用于短暫關(guān)系的響應(yīng)狀態(tài)以及持
久和短暫關(guān)系兩者的未來狀態(tài)。根據(jù)這種直觀情況,如果程序在任何 頭部語句中包括"非",則所述方式轉(zhuǎn)換"非,,以消除所有這種現(xiàn)象。
分層期望識別以下的語法條件,所述語法條件將確保存在程序 解答,并且該解答對于給定的初始狀態(tài)而言是唯一的。分層是這樣一 種條件。作為應(yīng)用所述重寫技術(shù)的結(jié)果,我們得到標(biāo)準(zhǔn)Datalog程序。 在這種情況下,我們將給定關(guān)系的四種狀態(tài)的每一種看作不同的關(guān) 系。我們釆用現(xiàn)有技術(shù)中提供的標(biāo)準(zhǔn)程序的分層語義。分層隱含的主 要構(gòu)思是沿著"非"來分割程序,從而在應(yīng)用非運(yùn)算符之前充分計算關(guān) 系。假設(shè)Datalog程序P,依賴曲線圖G是有向圖〈N, A>,其中,N 是P中所有謂項(xiàng)符號的集合,如果p和q分別是規(guī)則r的主體語句和頭部語句中的謂項(xiàng)符號,則a是從p到q的邊緣。如果將p作 為謂項(xiàng)符號的主體語句是非,則標(biāo)記謂項(xiàng)符號p與q之間的弧。如果 在包括標(biāo)記的弧的G中不存在循環(huán),則P被分層。對于分層程序的解 答是全局和唯一的,其獨(dú)立于分層的G以及所選擇的分層。
安全性Datalog程序的期望屬性是解答僅依賴于已知事實(shí), 而非依賴于所有事實(shí)的全體集合。這被稱為域獨(dú)立性。此外,我們希 望確保來自有限事實(shí)集合的規(guī)則評估產(chǎn)生有限結(jié)果集合。這稱為有限 性。由于域獨(dú)立性和有限性通常對于具有"非"和算術(shù)的Datalog程序 是無法確定的,所以作為替代,我們使用稱為安全性的保守語法特征。 安全性確保域獨(dú)立性和較弱的有限性,這意味著來自有限事實(shí)集合的 規(guī)則的前向應(yīng)用產(chǎn)生有限結(jié)果集合,而由無限遞歸造成的無限結(jié)果無 法排除。
安全性在Datalog中是>^知的,我們僅使用由R.T叩or在"Safe Database Queries with Arithmetic Relations", Proceeding of the 14th Australian Computer Science Conference (1991)(該文獻(xiàn)通過引用 合并于此)中建議的變型,其支持算術(shù)表達(dá)式和"非"。應(yīng)注意這是 關(guān)于轉(zhuǎn)換的程序的條件,其中,反應(yīng)器到Datalog的具體擴(kuò)展已經(jīng)編 譯完成。
簡言之,如果規(guī)則的所有變量是受限的,則規(guī)則是安全的。在以 下條件下,變量是受限的變量出現(xiàn)在主體中不是"非"的語句中;變 量出現(xiàn)在主體中的"非"語句中并且沒有在其它地方使用;或者變量出 現(xiàn)在表達(dá)式中,在該表達(dá)式中,在給出表達(dá)式的所有受限變量的情況 下可計算所述變量的唯一值。程序是安全的,則它的所有規(guī)則均是安 全的。考慮一些示例
(*1*)answer (x)<_ mynumbei: (x), not zei:o(x) (*2*)P(x)<- Q(y),R(z), x + y - z (*3*)P(x)<- Q(y》,R(z), x * y - z
規(guī)則(l)是安全的,但是去除mynumber(x)將導(dǎo)致其不安全, 因?yàn)閤隨后將不受限制。規(guī)則(2)是安全的,因?yàn)橐阎獃和z唯一 地給出x,但是規(guī)則(3)不安全,由于如果兩者為0,則x可以是任意值。
程序轉(zhuǎn)換為了在支持我們的語言特征的同時調(diào)節(jié)現(xiàn)有的 Datalog工作,提供一種程序轉(zhuǎn)換技術(shù),其將程序轉(zhuǎn)換為標(biāo)準(zhǔn)Datalog 程序。假設(shè)具有持久關(guān)系n,...,"和短暫關(guān)系tn ..,, U的反應(yīng)器
c,用r,v.,e來表示上述關(guān)系就在某反應(yīng)之前的內(nèi)容;如果c剛剛被 創(chuàng)建,則關(guān)系默認(rèn)為空。使、"、a。a-、《+和《—成為應(yīng)用于反應(yīng)器c
的更新束的添加以及刪除集合。我們可假設(shè)、A+ n A,—并且 、A+ n f_ —,因?yàn)樵趧?chuàng)建新的更新束之前將由發(fā)起反應(yīng)器檢查這一屬
性。用 -n,…,乂表示反應(yīng)的預(yù)狀態(tài), …,、表示激勵狀態(tài),r,"..,r"表示 響應(yīng)狀態(tài),,,,...,r 表示未來狀態(tài)。
圖2示出根據(jù)一實(shí)施例的重寫技術(shù)如何將頭部語句中具有"非" 的程序轉(zhuǎn)換為沒有"非"的程序。
再次參照圖2,使^和f作為需要添加到最終解答(即,持久
關(guān)系的響應(yīng)狀態(tài))和從最終解答刪除的元組的集合。使f和f -作為用 于短暫關(guān)系的添加和刪除集合。重寫規(guī)則(I)是分層直觀的,其計
算將被添加到ri的元組集合,作為主體語句解析的元組的集合。重寫 規(guī)則(II)按照非常類似的方式計算刪除集合;唯一的區(qū)別在于添加 主體語句,該主體語句僅當(dāng)已經(jīng)存在于反應(yīng)時才確保元組被從關(guān)系刪 除。額外語句確保這一重寫規(guī)則不會引入域依賴。規(guī)則(VI)在新添 加集合被計算出時立即將其添加到響應(yīng)狀態(tài);這確保最近的元組添加 可見,并傳播到其余的反應(yīng)器規(guī)則。我們希望類似地說明刪除集合, 但是將其表示為規(guī)則頭部中的"非",這正是程序轉(zhuǎn)換技術(shù)嘗試消除的 事物。因此,應(yīng)該將刪除集合說明為經(jīng)由反應(yīng)器規(guī)則傳播。重寫規(guī)則 (III)和(IV)所實(shí)現(xiàn)的正是這一處理。規(guī)則(III)限制n中的元 組到不處于刪除集合中的元組的匹配;相反,規(guī)則(IV)允許對刪除 集合中的元組的匹配。規(guī)則(V)將響應(yīng)狀態(tài)初始化為激勵狀態(tài)。規(guī) 則(VII)和(VIII)計算未來狀態(tài)的添加以及刪除集合。
對于短暫關(guān)系t….tm,不變地應(yīng)用規(guī)則(I)到(VI)。規(guī)則(VII) 和(VIII)不應(yīng)用于短暫關(guān)系,因?yàn)樗鼈儾痪哂形磥頎顟B(tài)。在反應(yīng)的開始時發(fā)生以下的賦值-r;:=< A。
=Ar,A+U-W,A— i :="f+
直觀上,第 一賦值用關(guān)系在當(dāng)前反應(yīng)之前的內(nèi)容重寫當(dāng)前反應(yīng)的
持續(xù)關(guān)系的預(yù)狀態(tài)。下一賦值隨后將相應(yīng)的更新束應(yīng)用于預(yù)狀態(tài)以獲 得激勵狀態(tài)。應(yīng)注意短暫關(guān)系的更新束 f-的刪除集合不產(chǎn)生任何
影響。這些賦值在Datalog外部完成。這些賦值的作用為在規(guī)則需 要讀取預(yù)狀態(tài)和激勵狀態(tài)的情況下,以IDB (內(nèi)部數(shù)據(jù)庫關(guān)系)關(guān)系 的形式保存預(yù)狀態(tài)和激勵狀態(tài)的瞬像拷貝。預(yù)狀態(tài)的拷貝還將用于回 退反應(yīng)的情況。在這一點(diǎn)上,我們可應(yīng)用標(biāo)準(zhǔn)Datalog技術(shù)以將規(guī)則 評估到不動點(diǎn)。如果在評估期間的任意點(diǎn), tf+n^- 0,匕,+n ^-^0,〖廣n〖,、0,或^+n ^廣-0,則評估停止
并且反應(yīng)回退。如果我們到達(dá)不動點(diǎn)(任何檢查均沒有失敗),則我 們更新當(dāng)前反應(yīng)的響應(yīng)狀態(tài),即,在關(guān)系在下一反應(yīng)之前的內(nèi)容,以 考慮刪除集合。該賦值在Datalog外部完成。:=r; "A—。在中止之
一 /
前,如果可應(yīng)用,則反應(yīng)形成用于其它反應(yīng)器以及其自身的更新束
(er,。"和(^+, 、假設(shè)轉(zhuǎn)換的程序是安全和分層的,則存在不 動點(diǎn)解答,并且該不動點(diǎn)解答是唯一的,給出關(guān)于反應(yīng)器狀態(tài)的完整 信息。
反應(yīng)器引用在一般情況下,在單個反應(yīng)中可涉及多個反應(yīng)器。 在自然的方式中,當(dāng)同步執(zhí)行的反應(yīng)器Ci的集合試圖將其范圍延伸到 新的反應(yīng)器Cj時,如果Cj已經(jīng)在反應(yīng)中涉及,則Ci首先等待Cj中止, 并接收Ci,對于范圍延伸的請求。Ci隨后回退,并且Ci和q兩者開始 作為由在反應(yīng)器Ci的更新束啟動的相同反應(yīng)的一部分而共同執(zhí)行。重 復(fù)這一操作,直到所述范圍擴(kuò)展到包括需要同步執(zhí)行的所有反應(yīng)器。
一種稍不自然的方式將首先基于類型信息在統(tǒng)計上計算所有同 步執(zhí)行的反應(yīng)器的傳遞閉包。其目的在于協(xié)調(diào)規(guī)則評估的定單與鎖定 的定單。程序?qū)⒂纱擞嬎憬y(tǒng)計上計算的反應(yīng)器閉包的全局分層;每當(dāng) 存在用于評估下一規(guī)則的規(guī)則選項(xiàng)時,程序?qū)⑦x擇與全局分層一致的 規(guī)則。這將確保在評估關(guān)系的非之前完整地計算關(guān)系中的正信息。
通過將反應(yīng)中的所有反應(yīng)器Ck的規(guī)則放置在一起而獲得的程序?qū)▽k中的關(guān)系的遠(yuǎn)程引用。為了使得所有的遠(yuǎn)程引用成為本 地引用,我們定義以下轉(zhuǎn)換。對于反應(yīng)器中的每個關(guān)系r,反應(yīng)器定 義陰影拷貝以及以下形式的隱含規(guī)則
r-(self, x) <- r(x)
對關(guān)系r的每個遠(yuǎn)程引用c.r(x)隨后可被轉(zhuǎn)換為對r(c,;c)的本地 訪問。在這一點(diǎn)上,統(tǒng)計上計算的規(guī)則集合僅包括本地引用,統(tǒng)計上 計算的規(guī)則集合被看作 一種我們可應(yīng)用上述重寫技術(shù)的程序。
實(shí)施問題反應(yīng)確保所有涉及的反應(yīng)器相對于環(huán)境的已知的 ACID屬性。具體說來,(1)所有涉及的反應(yīng)器成功,或者沒有反應(yīng) 器成功,(2)每個涉及的反應(yīng)器的響應(yīng)狀態(tài)在提交時將滿足所有可 應(yīng)用規(guī)則,(3)反應(yīng)外部的反應(yīng)器僅在所有涉及的反應(yīng)器已提交之 后僅可觀察到響應(yīng)狀態(tài),以及(4) 一旦所有的反應(yīng)器已提交,則反 應(yīng)將不會回退。
假設(shè)反應(yīng)在等待獲得讀取和寫入訪問的同時堵塞,則可能出現(xiàn)死
性能。核心Datalog詢問經(jīng)過積極的優(yōu)化,已經(jīng)存在大量關(guān)于增加 Datalog詢問的研究。
現(xiàn)在參照附圖,其中,相同的標(biāo)號代表與圖3中最初示出的部件 相同或相似的部件,框圖/流程圖示例性示出根據(jù)系統(tǒng)/方法的反應(yīng)。 在附圖的頂端部分示出用于執(zhí)行反應(yīng)器實(shí)例404的集合的時間線402, 所述反應(yīng)器實(shí)例標(biāo)注為M、 N和P,其相應(yīng)于時間線部分402上的每 個等級。框406代表每個反應(yīng)器408的可見狀態(tài)。網(wǎng)絡(luò)或分布式系統(tǒng) 410示出反應(yīng)器408的流程,鄰近反應(yīng)器408的框412包括它們相應(yīng) 的收件箱或收件箱隊(duì)列。收件箱402可包括用于關(guān)聯(lián)的反應(yīng)器實(shí)例的 未決更新束的多個集合。
反應(yīng)器實(shí)例M和N兩者將它們在時間i - 1的更新束分派到網(wǎng)絡(luò) 上并完成它們的反應(yīng)(這是對網(wǎng)絡(luò)的抽象,不需要涉及確切的網(wǎng)絡(luò))。 網(wǎng)絡(luò)將每個更新束插入其目標(biāo)反應(yīng)器實(shí)例(在這種情況下為M)的收 件箱412。遵循公平策略,在時間i,反應(yīng)器實(shí)例N在其收件箱中檢查新的更新束,如果存在新的更新束則使其出列,并使用所述新的更
新束來啟動新的反應(yīng)。類似地,在該反應(yīng)結(jié)束時,為反應(yīng)器實(shí)例M和 P分派新的更新束。
在圖3的部分420中示出反應(yīng)器(Mi) 408的內(nèi)部部分???06 是與附圖的頂端部分相同的可見狀態(tài),稱為響應(yīng)狀態(tài)。輸入框412中 的更新束是從目標(biāo)反應(yīng)器實(shí)例的狀態(tài)下關(guān)系的集合到元組的集合對 的總映射,其中,所述元組將被添加到目標(biāo)關(guān)系或者從目標(biāo)關(guān)系刪除。 當(dāng)新的更新束從收件箱412出列時,將在應(yīng)用操作422中以原子方式 對預(yù)狀態(tài)424 (-Si)應(yīng)用所述新的更新束的添加和刪除,以獲得激勵 狀態(tài)426 (ASi)。預(yù)狀態(tài)424是反應(yīng)器實(shí)例在先前反應(yīng)結(jié)束時的響應(yīng) 狀態(tài)。激勵狀態(tài)426從以下含義上來說是候選響應(yīng)狀態(tài)(Si):如果 反應(yīng)器不包括規(guī)則,則響應(yīng)狀態(tài)432與先前激勵狀態(tài)426相同。
如果反應(yīng)器包括規(guī)則428,則它們將重復(fù)執(zhí)行(遞歸),直到不 再向/從關(guān)系添加/刪除元組并且反應(yīng)靜止。規(guī)則428可讀取預(yù)狀態(tài) 424、激勵狀態(tài)426和響應(yīng)狀態(tài)432,并且可寫入響應(yīng)和本地或遠(yuǎn)程反 應(yīng)器的未來狀態(tài)430 (SiA)。訪問遠(yuǎn)程反應(yīng)器實(shí)例的響應(yīng)狀態(tài)432將 正在進(jìn)行的反應(yīng)延伸為包括反應(yīng)中的遠(yuǎn)程反應(yīng)器實(shí)例。
圖3示出涉及反應(yīng)器實(shí)例的反應(yīng)。寫入未來狀態(tài)430有效地定義 了更新束,該更新束將在當(dāng)前反應(yīng)結(jié)束時被分派。如果在相同的反應(yīng) 中涉及多個反應(yīng)器實(shí)例,則對于每個目標(biāo)反應(yīng)器實(shí)例分派單個的更新 束434。分派的更新束434可被提供給網(wǎng)絡(luò)410上的其它反應(yīng)器的其 它收件箱436。從外部觀察者看來,反應(yīng)以原子方式發(fā)生。反應(yīng)器的 計算可產(chǎn)生其它反應(yīng)器或同一反應(yīng)器的新的狀態(tài)更新,并且可動態(tài)地 例化新的反應(yīng)器。
參照圖4A和圖4B, 一種用于反應(yīng)器彼此交互作用的機(jī)制在于 經(jīng)由對所述其它反應(yīng)器的引用來讀取和寫入其它反應(yīng)器的狀態(tài)。這可 異步(圖4A)或同步(圖4B)地執(zhí)行。
反應(yīng)器450的關(guān)系可包括對其它反應(yīng)器451的引用。引用可用作 對于同步或異步更新的"目標(biāo)"。例如,在圖4A中,規(guī)則453產(chǎn)生對類型傳感器的反應(yīng)器451中的遠(yuǎn)程關(guān)系"請求"的異步狀態(tài)更新,并且 可在閉合反應(yīng)器450的關(guān)系rSensor 453中發(fā)現(xiàn)對s的引用。引用對
于異步更新的"目標(biāo)"或在復(fù)合反應(yīng)中可用作"目標(biāo)",其中,所述復(fù)合 反應(yīng)為涉及多于一個反應(yīng)器的同步原子反應(yīng)(圖4B)。
圖4B示出用于在兩個帳戶(463和464 )之間轉(zhuǎn)帳的反應(yīng)器460。 規(guī)則462引用兩個帳戶反應(yīng)器463和464以在所述帳戶之間同步轉(zhuǎn)移 收支差額。=是用于添加新值和刪除舊值的簡寫。
參照圖5,示例性示出反應(yīng)器狀態(tài)機(jī)的概況。將過渡(連接狀態(tài) 的邊緣)寫作{先決條件}活動{后置條件}。將狀態(tài)寫為{不變}狀態(tài)。 在處理的開始,反應(yīng)器處于非存在狀態(tài)502。在過渡504,反應(yīng)器實(shí) 例的預(yù)狀態(tài)-R、激勵狀態(tài)AR和響應(yīng)狀態(tài)R是相同(不變)的。在狀 態(tài)506,反應(yīng)器對反應(yīng)r作出反應(yīng)。在過渡510中遭遇的沖突促使反 應(yīng)器狀態(tài)回退到預(yù)狀態(tài),并且所有的鎖被解除。如果作為在過渡508 中應(yīng)用任何規(guī)則的結(jié)果而沒有遭遇沖突,則所有反應(yīng)被提交,更新束 被分派,所有的鎖被解除。
在靜止?fàn)顟B(tài)512,反應(yīng)器實(shí)例的預(yù)狀態(tài)、激勵狀態(tài)和響應(yīng)狀態(tài)是 相同(不變)的。假設(shè)反應(yīng)器實(shí)例處于靜止?fàn)顟B(tài)512,如果其收件箱 非空(AR=apply (-R,b),其中,b是過渡條件5"下的更新束),則 反應(yīng)器實(shí)例將選擇在狀態(tài)506中處理的更新束。處理更新束將啟動新 的反應(yīng),該新的反應(yīng)當(dāng)前僅包括啟動反應(yīng)器實(shí)例(動作)。結(jié)果,通 過以原子方式將更新束應(yīng)用于預(yù)狀態(tài)(后置條件)來獲得激勵狀態(tài)。
規(guī)則可讀取和寫入本地和遠(yuǎn)程關(guān)系。如果當(dāng)前反應(yīng)的范圍中的反 應(yīng)器實(shí)例之一中所包括的規(guī)則寫入遠(yuǎn)程關(guān)系的響應(yīng)狀態(tài),則擁有所述 關(guān)系的反應(yīng)器實(shí)例將反應(yīng)加入過渡516。過渡地,非被動地讀取(例 如,它們的狀態(tài)將被影響)所述遠(yuǎn)程關(guān)系的所有反應(yīng)器實(shí)例也成為該 反應(yīng)的一部分。從外部觀察者看來,反應(yīng)中的所有反應(yīng)器實(shí)例以原子 方式執(zhí)4亍。
在反應(yīng)的持續(xù)期間,反應(yīng)中涉及的反應(yīng)器實(shí)例被自動鎖定在狀態(tài) 522下,直到其在以下條件中的任一個下在過渡520中被解除發(fā)現(xiàn)并提交靜止響應(yīng)狀態(tài)(過渡508 ),或者沖突促使反應(yīng)器回退到它的 預(yù)狀態(tài)(過渡510)。此外,在過渡518中類似地鎖定擁有正由反應(yīng) 中的反應(yīng)器讀取的關(guān)系的所有反應(yīng)器實(shí)例。當(dāng)反應(yīng)器實(shí)例被鎖定時, 其拒絕任何交互作用讀取,寫入,開始利用不是相同反應(yīng)的一部分 的反應(yīng)器實(shí)例對更新束作出反應(yīng)。結(jié)果,除了處理更新束的初始反應(yīng) 器實(shí)例之外,在反應(yīng)中涉及的所有反應(yīng)器實(shí)例的激勵狀態(tài)均與預(yù)狀態(tài) 相同。鎖定將確保如果稍后需要在相同的反應(yīng)中寫入正在讀取的反 應(yīng)器,則對反應(yīng)器的預(yù)狀態(tài)和響應(yīng)狀態(tài)的引用將引用連續(xù)的狀態(tài)。
當(dāng)涉及的所有反應(yīng)器實(shí)例已經(jīng)到達(dá)滿足它們的所有規(guī)則的狀態(tài) 時,反應(yīng)完成。如果一個或多個反應(yīng)器實(shí)例不能滿足它們的規(guī)則,則 存在沖突,所有涉及的反應(yīng)器回退到它們的預(yù)狀態(tài),鎖被解除,不產(chǎn) 生更新束。否則,反應(yīng)提交,鎖被解除,更新束被分派。將通過收集 由提交反應(yīng)中涉及的所有反應(yīng)器實(shí)例執(zhí)行的所有未來狀態(tài)更新,對每 個目標(biāo)反應(yīng)器產(chǎn)生一個更新束。
參照圖6,示例性示出用于允許應(yīng)用之間的交互作用的系統(tǒng)和方法。
在塊602中,從反應(yīng)器的收件箱隊(duì)列"讀取,,更新束。在塊604 中,將更新束應(yīng)用于預(yù)狀態(tài)以獲得激勵狀態(tài)。在塊606中,按照任何 定單以原子方式執(zhí)行所有反應(yīng)器規(guī)則,以確定當(dāng)前和/或其它反應(yīng)器的 響應(yīng)狀態(tài)和/或未來狀態(tài)。在塊608中,如果規(guī)則例化新的反應(yīng)器,則 反應(yīng)將它的范圍延伸到包括新創(chuàng)建的反應(yīng)器。在塊610中,如果規(guī)則 寫入遠(yuǎn)程反應(yīng)器的響應(yīng)狀態(tài),則反應(yīng)將它的范圍延伸到包括遠(yuǎn)程反應(yīng) 器以及包括讀取正在寫入的關(guān)系的規(guī)則的所有反應(yīng)器。在塊612中, 復(fù)合反應(yīng)保持原子性。在塊614,采用鎖定規(guī)定或機(jī)制來保證原子屬 性,可采用多個不同的方案來代替或補(bǔ)充鎖定處理。在塊616中,寫 入遠(yuǎn)程反應(yīng)器的響應(yīng)狀態(tài)將同步地構(gòu)建多個反應(yīng)器。
在塊618中,如果至少一個規(guī)則無法滿足,則所有涉及的反應(yīng)器 以原子方式回退到它們在反應(yīng)之前的各個狀態(tài)。如果反應(yīng)回退,則在 塊620中不產(chǎn)生更新束。如果反應(yīng)中的所有規(guī)則在它們的執(zhí)行靜止時被滿足,則在塊622,寫入反應(yīng)器的未來狀態(tài)以異步地構(gòu)建反應(yīng)器。 在塊624中對于每個反應(yīng)的每個目標(biāo)反應(yīng)器,將產(chǎn)生一個更新束。
參照圖7,規(guī)則執(zhí)行的定單與所選擇的語言語義無關(guān)。換言之, 可以按任何定單來執(zhí)行規(guī)則,即,與定單無關(guān)的執(zhí)行。用于規(guī)則執(zhí)行 的處理模型的一種可行實(shí)施例提供以下特征。在塊702中,根據(jù)在復(fù) 合反應(yīng)中涉及的所有反應(yīng)器的規(guī)則P的集合,提供與定單無關(guān)的執(zhí)行。 這包括重寫P中的規(guī)則,以僅在塊704中計算關(guān)于反應(yīng)器狀態(tài)的正 信息。換言之,我們重寫在規(guī)則頭部中具有非的規(guī)則,以去除所述非。 這導(dǎo)致僅在規(guī)則主體中具有非的新的規(guī)則集合。
在塊706中,建立有向的依賴曲線圖G: <N, A>,其中,N是 P中所有謂項(xiàng)符號的集合,如果p和q分別是規(guī)則r的主體語句和頭 部語句中的謂項(xiàng)符號,則(A中的)a是從p到q的邊緣。如果將p 作為謂項(xiàng)符號的主體語句是非,則在塊710中標(biāo)記p與q之間的孤(邊 緣)。如果在具有至少一個標(biāo)記的弧的G中存在循環(huán),則規(guī)則P的集 合不被滿足,并且在塊712中,復(fù)合反應(yīng)將以原子方式回退。否則, 在塊714中,對規(guī)則下定單,從而在給定關(guān)系用于確定給定值到所述 關(guān)系的非成員關(guān)系之前完整地計算所述給定關(guān)系。
優(yōu)點(diǎn)在于,與定單無關(guān)的特征允許升級應(yīng)用。通過添加或去除規(guī) 則來升級應(yīng)用不涉及修改規(guī)則的現(xiàn)有集合。將通過添加或去除與已經(jīng) 添加或刪除的規(guī)則相應(yīng)的節(jié)點(diǎn)和/或邊緣來單獨(dú)地修改依賴關(guān)系圖。這 一屬性允許以正交的aspect-like方式添加新的功能或修改現(xiàn)有功能。
已經(jīng)描述了用于松耦合應(yīng)用的面向數(shù)據(jù)的編程模型的系統(tǒng)和方 法的優(yōu)選實(shí)施例(其僅作為示例而不是限制),但是應(yīng)注意本領(lǐng)域 的技術(shù)人員可根據(jù)以上教導(dǎo)的指示進(jìn)行修改或變化。因此,應(yīng)理解 可對所公開的具體實(shí)施例進(jìn)行修改,所述修改落入由所附權(quán)利要求限 定的本發(fā)明的精神和范圍之內(nèi)。在如此描述了本發(fā)明的各方面之后, 其中具有專利法所要求的細(xì)節(jié)和特點(diǎn),在權(quán)利要求中闡述所要求權(quán)利 的并期望受專利證書保護(hù)的內(nèi)容。
權(quán)利要求
1、一種用于在分布式網(wǎng)絡(luò)中保持?jǐn)?shù)據(jù)一致性的反應(yīng)器,所述反應(yīng)器包括收件箱,被配置為用于接收更新信息;應(yīng)用操作,被配置為用于將更新信息應(yīng)用于預(yù)狀態(tài),以基于更新信息確定激勵狀態(tài);以及響應(yīng)狀態(tài),其根據(jù)激勵狀態(tài)來確定,所述響應(yīng)狀態(tài)是由分布式網(wǎng)絡(luò)系統(tǒng)中的其它組件從反應(yīng)器看來外部可見的唯一狀態(tài),從而反應(yīng)器對更新信息作出反應(yīng),并在分布式網(wǎng)絡(luò)中通過其可見狀態(tài)來啟動其它反應(yīng),以保持?jǐn)?shù)據(jù)一致性。
2、 如權(quán)利要求1所述的反應(yīng)器,還包括至少一個規(guī)則,所述規(guī) 則在反應(yīng)期間進(jìn)一步定義反應(yīng)器的至少一個狀態(tài)。
3、 如權(quán)利要求2所述的反應(yīng)器,其中,所述至少一個規(guī)則包括 如下的一個或多個規(guī)則,所述一個或多個規(guī)則被遞歸地執(zhí)行以提供響 應(yīng)狀態(tài)。
4、 如權(quán)利要求3所述的反應(yīng)器,其中,所述至少一個規(guī)則是聲 明的,并被配置用于與定單無關(guān)的執(zhí)行。
5、 如權(quán)利要求1所述的反應(yīng)器,其中,反應(yīng)器保持靜止,直到 被更新束激勵。
6、 如權(quán)利要求1所述的反應(yīng)器,其中,對于反應(yīng)器,所述更新 束被作為目標(biāo)。
7、 如權(quán)利要求1所述的反應(yīng)器,還包括基于預(yù)狀態(tài)、激勵狀 態(tài)和響應(yīng)狀態(tài)確定的未來狀態(tài)。
8、 如權(quán)利要求7所述的反應(yīng)器,其中,未來狀態(tài)的確定導(dǎo)致將 更新束分派到包括所述反應(yīng)器自身的其它反應(yīng)器,以異步地啟動后來 的反應(yīng)。
9、 如權(quán)利要求1所述的反應(yīng)器,其中,反應(yīng)器的反應(yīng)以原子方 式發(fā)生。
10、 如權(quán)利要求9所述的反應(yīng)器,其中,使用在反應(yīng)的持續(xù)期間 鎖定反應(yīng)器的鎖定機(jī)制來獲得原子性。
11、 如權(quán)利要求l所述的反應(yīng)器,其中,所述反應(yīng)器對同步交互 作用和異步交互作用都進(jìn)行處理。
12、 一種用于在分布式網(wǎng)絡(luò)中保持?jǐn)?shù)據(jù)一致性的反應(yīng)器,所述反 應(yīng)器包括根據(jù)與反應(yīng)器關(guān)聯(lián)的至少一個關(guān)系提供的反應(yīng)器狀態(tài),其中,反應(yīng)器狀態(tài)能根據(jù)在分布式網(wǎng)絡(luò)系統(tǒng)中接收的更新信息來修改;以及至少一個規(guī)則,其被配置為用于保持?jǐn)?shù)據(jù)一致性,從而如果一致 性被破壞,則反應(yīng)失敗,以使得反應(yīng)器狀態(tài)回退到在反應(yīng)被啟動之前 的狀態(tài)。
13、 如權(quán)利要求12所述的反應(yīng)器,其中,所述至少一個規(guī)則是 聲明的,并被配置用于與定單無關(guān)的執(zhí)行。
14、 如權(quán)利要求12所述的反應(yīng)器,其中,反應(yīng)器狀態(tài)在反應(yīng)成 功時被修改,并且在反應(yīng)失敗的情況下保持不變。
15、 如權(quán)利要求12所述的反應(yīng)器,其中,所述至少一個關(guān)系包 括用于定義反應(yīng)器狀態(tài)的關(guān)系的集合。
16、 如權(quán)利要求12所述的反應(yīng)器,其中,更新信息包括由反應(yīng) 器接收的更新束,更新束包括將被添加和/或刪除以變更反應(yīng)器狀態(tài)的 信息。
17、 如權(quán)利要求12所述的反應(yīng)器,其中,反應(yīng)器保持原子性, 從而響應(yīng)狀態(tài)是從反應(yīng)器外部可見的唯一狀態(tài)。
18、 如權(quán)利要求12所述的反應(yīng)器,其中,反應(yīng)器包括預(yù)狀態(tài), 并且如果反應(yīng)失敗,則反應(yīng)器回退到預(yù)狀態(tài)。
19、 如權(quán)利要求12所述的反應(yīng)器,其中,反應(yīng)器對同步交互作 用和異步交互作用都進(jìn)行處理。
20、 如權(quán)利要求1所述的反應(yīng)器,其中,反應(yīng)器之間的接口是數(shù) 據(jù),從而反應(yīng)器對數(shù)據(jù)更新作出反應(yīng)。
21、 一種用于在分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性的方法,包括將更新信息輸入到反應(yīng)器;以原子方式按照任何定單執(zhí)行在所有涉及的反應(yīng)器中的所有規(guī) 則,以便確定所述反應(yīng)器以及反應(yīng)中的其它反應(yīng)器的響應(yīng)狀態(tài)和未來 狀態(tài)中的至少一個;如果至少一個規(guī)則無法滿足,則以原子方式將所有涉及的反應(yīng)器 回退到它們在所述反應(yīng)之前的各個狀態(tài);以及如果反應(yīng)中的所有規(guī)則被滿足,則產(chǎn)生用于包括所述反應(yīng)器的其 它反應(yīng)器的更新信息,以在整個分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性。
22、 如權(quán)利要求21所述的方法,其中,產(chǎn)生用于目標(biāo)反應(yīng)器的 更新信息包括當(dāng)反應(yīng)器執(zhí)行靜止時,對于每個反應(yīng)的每個目標(biāo)反應(yīng) 器產(chǎn)生一個更新束。
23、 如權(quán)利要求21所述的方法,還包括如果規(guī)則例化新的反 應(yīng)器,則將反應(yīng)范圍延伸為包括新創(chuàng)建的反應(yīng)器。
24、 如權(quán)利要求21所述的方法,還包括如果規(guī)則寫入遠(yuǎn)程反 應(yīng)器的響應(yīng)狀態(tài),則將反應(yīng)范圍延伸為包括遠(yuǎn)程反應(yīng)器以及具有讀取 正在寫入的關(guān)系的規(guī)則的所有反應(yīng)器。
25、 如權(quán)利要求21所述的方法,其中,以原子方式執(zhí)行所有反 應(yīng)器規(guī)則包括提供鎖定規(guī)定以確保原子性。
26、 如權(quán)利要求21所述的方法,還包括當(dāng)寫入遠(yuǎn)程反應(yīng)器的 響應(yīng)狀態(tài)時,同步地構(gòu)建多個反應(yīng)器。
27、 如權(quán)利要求21所述的方法,其中,如果反應(yīng)回退,則不產(chǎn) 生任何更新束。
28、 如權(quán)利要求21所述的方法,還包括當(dāng)寫入反應(yīng)器的未來 狀態(tài)時,異步地構(gòu)建反應(yīng)器。
29、 如權(quán)利要求21所述的方法,其中,更新信息包括具有元組 的更新束,以及所述方法還包括將更新信息應(yīng)用于預(yù)狀態(tài)以創(chuàng)建激 勵狀態(tài)。
30、 如權(quán)利要求21所述的方法,其中,更新束包括對于預(yù)狀態(tài) 的添加和刪除中的至少一個。
31、 如權(quán)利要求21所述的方法,其中,遞歸地應(yīng)用所述規(guī)則。
32、 一種用于在分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性的計算機(jī)程序產(chǎn) 品,其包括含有計算機(jī)可讀程序的計算機(jī)可用介質(zhì),其中,所述計算 機(jī)可讀程序在計算機(jī)上執(zhí)行時使計算機(jī)執(zhí)行以下步驟將更新信息輸入到反應(yīng)器;以原子方式按照任何定單執(zhí)行在所有涉及的反應(yīng)器中的所有規(guī) 則,以便確定用于所述反應(yīng)器以及反應(yīng)中的其它反應(yīng)器的響應(yīng)狀態(tài)和未來狀態(tài)中的至少一個;如果至少 一個規(guī)則無法滿足,則以原子方式將所有涉及的反應(yīng)器回退到它們在所述反應(yīng)之前的各個狀態(tài);以及如果反應(yīng)中的所有規(guī)則被滿足,則產(chǎn)生用于包括所述反應(yīng)器的其 它反應(yīng)器的更新信息,以在整個分布式系統(tǒng)中保持?jǐn)?shù)據(jù)一致性。
33、 一種被配置為用于保持?jǐn)?shù)據(jù)一致性的系統(tǒng),包括 設(shè)置在分布式系統(tǒng)內(nèi)的多個反應(yīng)器,其中,每個反應(yīng)器包括收件箱,其被配置為用于接收更新信息;應(yīng)用操作,其被配置為用于將更新信息應(yīng)用于預(yù)狀態(tài)以基于 更新信息確定激勵狀態(tài);以及根據(jù)所述激勵狀態(tài)得出的響應(yīng)狀態(tài),該響應(yīng)狀態(tài)是從反應(yīng)器 看來外部可見的唯一狀態(tài);其中,每個反應(yīng)器處于以下兩種情況中的至少一種反應(yīng)器異步 響應(yīng)于來自包括該反應(yīng)器本身的其它反應(yīng)器的更新信息;以及反應(yīng)器 同步響應(yīng)于從其它反應(yīng)器寫入的數(shù)據(jù)。
34、 如權(quán)利要求33所述的系統(tǒng),其中,更新信息包括如下數(shù)據(jù), 該數(shù)據(jù)包括對反應(yīng)器的引用。
35、 如權(quán)利要求33所述的系統(tǒng),還包括一個或多個規(guī)則,所述 一個或多個規(guī)則被執(zhí)行以提供響應(yīng)狀態(tài),其中,所述一個或多個規(guī)則 是聲明的,并被配置用于與定單無關(guān)的執(zhí)行。
全文摘要
一種被配置為用于保持?jǐn)?shù)據(jù)一致性的反應(yīng)器和方法。所述反應(yīng)器包括被配置為用于接收更新信息的收件箱。應(yīng)用操作被配置為用于將更新信息應(yīng)用于預(yù)狀態(tài)以基于更新信息確定激勵狀態(tài)。響應(yīng)狀態(tài)根據(jù)所述激勵狀態(tài)得出。響應(yīng)狀態(tài)是從反應(yīng)器看來外部可見的唯一狀態(tài)。
文檔編號G06F9/44GK101315600SQ20071018608
公開日2008年12月3日 申請日期2007年11月15日 優(yōu)先權(quán)日2007年6月1日
發(fā)明者克里斯蒂安·斯蒂芬森, 布魯斯·D.·盧卡斯, 拉法·A.·霍斯, 查爾斯·F.·維查, 瑪利亞-克里斯蒂娜·V.·馬里奈斯庫, 約翰·H.·菲爾德, 馬克·N.·維格曼 申請人:國際商業(yè)機(jī)器公司