大規(guī)模服務(wù)允許跨海量數(shù)據(jù)的事務(wù)(transaction)并且經(jīng)常保存數(shù)據(jù)的多個復(fù)本?;A(chǔ)資源具有有限限度,這限制了能夠在任意單個事務(wù)中處理的數(shù)據(jù)的量。作為結(jié)果,大規(guī)模服務(wù)通常被設(shè)計為具有固定的規(guī)模單位(scale unit)。當(dāng)服務(wù)上的負(fù)載超過規(guī)模單位時,可以添加額外的規(guī)模單位并且數(shù)據(jù)可以跨多個規(guī)模單位進(jìn)行分區(qū)。盡管這允許服務(wù)容納增加的量的數(shù)據(jù),但是事務(wù)不再能夠跨已經(jīng)被分區(qū)的數(shù)據(jù)來執(zhí)行。
針對該問題的傳統(tǒng)的解決方案包括使用同步機制來調(diào)和數(shù)據(jù)、迫使對數(shù)據(jù)進(jìn)行的人工劃分適應(yīng)該規(guī)模單位、或者放棄事務(wù)。同步機制經(jīng)常非常復(fù)雜并且具有多方主導(dǎo)的問題。如果針對文檔進(jìn)行了沖突的編輯,則需要用戶干預(yù)來解決該沖突。由于傳播延遲,沖突可能在用戶已經(jīng)得到事務(wù)成功的確認(rèn)并且登出服務(wù)之后才會發(fā)生。因此,沖突可能長時間無法解決。
使得未解決的沖突最小化的一種機制是具有負(fù)責(zé)特定的記錄的權(quán)限,但是這在記錄被復(fù)制并存儲在多個地方時不能夠得到高效地處理。傳統(tǒng)的解決方案使用諸如Paxos之類的一致性協(xié)議來在存儲復(fù)本的頂端構(gòu)建人工權(quán)限。然而,當(dāng)一致性系統(tǒng)中的節(jié)點由于網(wǎng)絡(luò)運行中斷而不可用或者無法進(jìn)行通信時,該一致性系統(tǒng)存在問題。
關(guān)于這些和其他考慮而進(jìn)行了本發(fā)明。盡管已經(jīng)討論了相對具體的問題,但是應(yīng)當(dāng)理解的是,在本文中所公開的實施例不應(yīng)該限于解決在
背景技術(shù):
中所標(biāo)識的具體的問題。
技術(shù)實現(xiàn)要素:
提供了該發(fā)明內(nèi)容以用簡化的形式引入了在下文的具體實施方式部分中所進(jìn)一步描述的概念的選擇。該發(fā)明內(nèi)容不旨在標(biāo)識所要求保護(hù)的主題的關(guān)鍵特征或本質(zhì)特征,也不旨在用來幫助確定所要求保護(hù)的主題的范圍。
一種可擴展最終一致性系統(tǒng)的實施例包括事務(wù)對象模型,其允許針對大規(guī)模服務(wù)的高效且可擴展的最終一致性。在可擴展最終一致性系統(tǒng)內(nèi),由分離的層來處理寫請求和讀請求。日志服務(wù)寫請求(例如,對文檔的寫入)在分區(qū)方案中與寫動作相一致。存儲服務(wù)讀請求(即,視圖的讀取)在分區(qū)方案中與讀動作相一致。該日志包括用于存儲文檔的至少一個基于文檔的分區(qū)。該存儲包括用于存儲文檔的至少一個基于視圖的分區(qū)。
當(dāng)用戶執(zhí)行諸如創(chuàng)建、修改、或刪除文檔之類的動作時,寫請求被傳送至可擴展最終一致性系統(tǒng)。在接收之后,該可擴展最終一致性系統(tǒng)首先將該寫請求保存至日志。在已經(jīng)將該寫請求保存至日志之后,對文檔的改變被認(rèn)為是將要接受的。該可擴展最終一致性系統(tǒng)的實施例可以在接收之后在至少兩個不同的位置中將該寫請求保存至日志。可以將該寫請求的一個副本作為運行記錄來保存,所述運行記錄充當(dāng)標(biāo)識還沒有與存儲完全融合的寫請求的動作項。該寫請求的另一個副本可以作為示出了不同版本之間的對文檔的改變的歷史記錄來保存。
改變提交層負(fù)責(zé)將寫請求從日志傳播至存儲。文檔寫從日志流至存儲從而沒有復(fù)雜的同步機制。在各個實施例中,可擴展最終一致性系統(tǒng)可以當(dāng)運行記錄在日志中被創(chuàng)建時進(jìn)行首次嘗試以將所述運行記錄復(fù)制到存儲。一旦已經(jīng)成功地復(fù)制了運行記錄,就將該運行記錄從日志中刪除。
一致性恢復(fù)層負(fù)責(zé)改變提交層的循環(huán)操作并最后提供最終一致性。一致性恢復(fù)層持續(xù)地提示改變提交層以通讀由日志所保存的現(xiàn)有的記錄并且將任何運行記錄復(fù)制到存儲。
附圖說明
通過參考以下附圖,本公開的進(jìn)一步的特征、方面、和優(yōu)點將變得更好地被理解,其中,元素不是按比例繪制的,以便更為清楚地示出細(xì)節(jié),并且其中,相同的附圖標(biāo)記在多個視圖通篇中指示相同的元素:
圖1示出了在大規(guī)模服務(wù)中所實現(xiàn)的可擴展最終一致性系統(tǒng)的一個實施例的系統(tǒng)架構(gòu);
圖2是表示針對日志的一個分區(qū)的運行和歷史記錄的一個實施例的圖示;
圖3是由可擴展最終一致性系統(tǒng)所采用的最終一致性方法的一個實施例的高級流程圖;
圖4是可擴展最終一致性系統(tǒng)的一個實施例的流程圖;
圖5A至5D示出了在可擴展最終一致性系統(tǒng)內(nèi)如何對涉及具有各種關(guān)系的文檔的各種事務(wù)(即,編輯)進(jìn)行處理;
圖6是示出了利用其可以實踐本發(fā)明的實施例的計算設(shè)備的物理組件的一個實施例的框圖;和
圖7A和7B是利用其可以實踐本發(fā)明的實施例的移動計算設(shè)備的簡化框圖。
具體實施方式
參考形成本發(fā)明的一部分并示出了具體的示例性實施例的附圖以在下文中更加充分地描述各種實施例。然而,實施例可以以許多不同的形式來實現(xiàn),并且不應(yīng)該被理解為限于在本文中所闡述的實施例;相反,提供了這些實施例以使得該公開將是透徹的和完整的,并且將會向本領(lǐng)域技術(shù)人員完全傳達(dá)實施例的范圍。實施例可以被實踐為方法、系統(tǒng)、或設(shè)備。從而,實施例可以采取硬件實現(xiàn)、完全軟件實現(xiàn)、或者組合了軟件和硬件方面的實現(xiàn)的形式。因此,以下詳細(xì)描述將不被理解為限制意義。
在本文中描述并且在附圖中示出了可擴展最終一致性系統(tǒng)的實施例。該可擴展最終一致性系統(tǒng)使用邏輯文檔日志以在大規(guī)模服務(wù)中提供跨分區(qū)的最終一致性。該系統(tǒng)允許通過并行化來對文檔的大量互連的圖進(jìn)行事務(wù)性編輯而并不犧牲線性可擴展性,只要沒有文檔寫需要事務(wù)性地跨越多個文檔。該系統(tǒng)將編輯的權(quán)限與重復(fù)的存儲分離,以允許高效的事務(wù)和線性可擴展性。將所有文檔寫都寫至日志中的特定于文檔的分區(qū),在這里將文檔寫進(jìn)行排隊直到改變被傳播至存儲的基于視圖的分區(qū)為止。一旦當(dāng)未完成的文檔寫被成功地復(fù)制到存儲,就將其從日志中移除。通過持續(xù)地檢查日志并且嘗試將任何未完成的文檔寫復(fù)制到存儲,該系統(tǒng)在沒有諸如一致協(xié)議(例如,Paxos)之類的復(fù)雜的同步機制的情況下提供最終一致性。該系統(tǒng)以這樣的方式來對文檔的隸屬和包含關(guān)系進(jìn)行建模:允許將最終影響多于一個文檔的文檔寫作為對單個文檔的編輯來通過日志進(jìn)行高效地處理而不用求助于人工分區(qū)。
圖1示出了可擴展最終一致性系統(tǒng)的一個實施例的系統(tǒng)架構(gòu)??梢栽谙蛴脩?02提供對大量信息的訪問和存儲的大規(guī)模(例如,大數(shù)據(jù))服務(wù)中實現(xiàn)可擴展最終一致性系統(tǒng)100。用戶可以經(jīng)由網(wǎng)絡(luò)106從各種客戶端設(shè)備104a-d訪問大規(guī)模服務(wù),所述網(wǎng)絡(luò)例如但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、局域網(wǎng)、及其組合。合適的客戶端設(shè)備的示例包括但不限于臺式計算機104a、膝上型計算機104b、平板計算機104c、移動電話104d、個人數(shù)字助理、智能手表、以及智能電器(例如,智能電視)。
可擴展最終一致性系統(tǒng)包括提供對大規(guī)模服務(wù)的入口點的前端層108。在各種實施例中,該大規(guī)模服務(wù)可以提供基于網(wǎng)絡(luò)的用戶接口,所述用戶接口能夠通過諸如瀏覽器之類的用戶代理而由客戶端設(shè)備所訪問。在一些實施例中,用戶代理可以是提供用戶接口并且處理與大規(guī)模服務(wù)的通信的專用客戶端應(yīng)用。
事務(wù)對象模型110允許針對大規(guī)模服務(wù)的高效且可擴展的最終一致性。由該可擴展最終一致性系統(tǒng)所處理的事務(wù)包括但不限于寫請求和讀請求,它們允許用戶讀取、查看(即,顯示)、創(chuàng)建、復(fù)制、刪除、操縱(即,編輯或修改)、分享、協(xié)同、或保存(即,寫)由大規(guī)模服務(wù)所處理的文檔和視圖。術(shù)語“文檔”寬泛地涵蓋了由大規(guī)模服務(wù)所處理的任何數(shù)據(jù)對象。作為示例,針對基于辦公或生產(chǎn)力應(yīng)用的大規(guī)模服務(wù)而言,文檔可以包括但不限于文字處理文檔、郵件項目、任務(wù)項目、日歷項目、聯(lián)系人項目、演示、電子表格、或數(shù)據(jù)庫。術(shù)語“視圖”寬泛地涵蓋了用來向用戶呈現(xiàn)文檔的基于常見屬性值的文檔的任何索引、分組、或類別。作為示例,視圖可以允許由任務(wù)所有者或者由與該任務(wù)相關(guān)聯(lián)的項目來顯示任務(wù)項目的集合。
在可擴展最終一致性系統(tǒng)內(nèi),由分離的層來處理寫請求112和讀請求114。日志116以與寫動作一致的分區(qū)方案來為寫請求(例如,對文檔的寫入)服務(wù)。存儲118以與讀動作一致的分區(qū)方案來為讀請求(例如,視圖的讀取)服務(wù)。在所圖示的實施例中,將日志和存儲表示為通過對應(yīng)的應(yīng)用程序接口(API)(日志API 120、和存儲API 122)來訪問的虛擬化的存儲資源(例如,云存儲)。
日志包括用于存儲文檔的至少一個基于文檔的分區(qū)124?;诜峙浣o單個資源或查詢的數(shù)據(jù)的最大分組來設(shè)置每個分區(qū)的大小。隨著由大規(guī)模服務(wù)所處理的數(shù)據(jù)的量的增加,可以線性地擴展日志并且添加新的分區(qū)。無論日志分區(qū)的數(shù)量如何,可擴展最終一致性系統(tǒng)都將與任何給定的文本相關(guān)聯(lián)的所有寫請求全部存儲在同一日志分區(qū)中。具有與每個文檔相關(guān)聯(lián)的單個日志分區(qū)允許針對每個文檔而保存事務(wù)編輯隊列。
存儲包括用于存儲文檔的至少一個基于視圖的分區(qū)126。按視圖對存儲進(jìn)行分區(qū)允許文檔高效地被多個用戶同時進(jìn)行訪問。如果文檔與多于一個視圖相關(guān)聯(lián),則每個視圖通常保存文檔的其自己的副本(即,復(fù)本)。在該存儲內(nèi),文檔的各種復(fù)本/視圖形成跨多個分區(qū)分布的文檔的大量互連的圖。盡管一些文檔除了該文檔的復(fù)本之外可以獨立于所有其他文檔,但是其他文檔可以憑借包含關(guān)系或隸屬關(guān)系而進(jìn)行互連。例如,單個的個人任務(wù)可以獨立于存儲內(nèi)的其他文檔。一個文檔也可以涉及存儲中的另一個文檔,例如,分配給項目的任務(wù)。該項目可以充當(dāng)多個任務(wù)的容器。類似地,文檔可以涉及存儲中對視圖有影響的其他實體,例如,分配給項目的人員。就如日志一樣,可以線性地擴展存儲并且添加新的分區(qū)以處理額外的文檔或視圖。
當(dāng)用戶執(zhí)行諸如創(chuàng)建、修改、或刪除文檔的動作時,將寫請求傳送至可擴展最終一致性系統(tǒng)。在接收之后,該可擴展最終一致性系統(tǒng)首先將該寫請求保存至日志。在已經(jīng)將該寫請求保存至日志之后,對文檔的改變被認(rèn)為是將要接受的,但是在該寫請求中所反映的改變通常不是對所有用戶可見的,直至它們已經(jīng)融入存儲中為止。當(dāng)日志包括多個分區(qū)時,該可擴展最終一致性系統(tǒng)可以確定指示該寫請求應(yīng)當(dāng)被寫入的分區(qū)的分區(qū)標(biāo)識符。在各種實施例中,該分區(qū)標(biāo)識符可以基于與該寫請求相關(guān)聯(lián)的文檔的文檔標(biāo)識符。
可擴展最終一致性系統(tǒng)使用日志作為用于保存寫請求直到它們已經(jīng)融入合適的視圖為止的暫存區(qū)域(staging area)。當(dāng)檢測到針對文檔的沖突編輯時也可以使用該日志。為了實現(xiàn)這些功能,可擴展最終一致性系統(tǒng)的實施例可以在接收寫請求之后,在至少兩個不同的位置將該寫請求保存至日志??梢詫⒃搶懻埱蟮囊粋€副本保存為運行記錄128,其充當(dāng)標(biāo)識還沒有與存儲完全融合的寫請求的動作項。無法將寫請求復(fù)制到存儲可以是分區(qū)或者日志與存儲之間的通信信道(例如,互聯(lián)網(wǎng))暫時無法訪問(例如,資源故障或停機)的結(jié)果。可以將該寫請求的另一個副本保存為歷史記錄130??梢猿鲇谥T如檢測對文檔的沖突編輯或維護(hù)審計日志之類的目的來使用歷史記錄。
改變提交層132負(fù)責(zé)以并行化的方式將寫請求從日志傳播至存儲。文檔寫從日志流動至存儲,因此不存在復(fù)雜的同步機制。換句話說,對每個視圖/復(fù)本的更新獨立于受到文檔寫影響的對其他視圖/復(fù)本的更新。這進(jìn)而允許文檔寫以及每個更新作為單個的文檔事務(wù)來進(jìn)行而并不求助于人工劃分(即,將文檔圖細(xì)分為人工的規(guī)模單位或區(qū))。在各種實施例中,該可擴展最終一致性系統(tǒng)可以當(dāng)在日志中創(chuàng)建運行記錄時首次嘗試將其復(fù)制到存儲。一旦已經(jīng)成功地復(fù)制了運行記錄,就將該運行記錄從該日志中刪除。
一致性恢復(fù)層134負(fù)責(zé)該改變提交層的循環(huán)操作并最后提供最終一致性。一致性恢復(fù)層提示改變提交層通讀由日志所保存的現(xiàn)有的記錄并且將任何運行記錄復(fù)制至存儲。在各種實施例中,該改變提交層以最老的運行記錄開始,按照編輯被該可擴展最終一致性系統(tǒng)所接收的順序來對文檔進(jìn)行事務(wù)性編輯。該一致性恢復(fù)層可以基于各種事件的發(fā)生和/或定期地(例如,每N分鐘、小時、或天)發(fā)起改變提交層的操作??梢杂脕碛|發(fā)改變提交層的操作的事件的示例包括但不限于:系統(tǒng)啟動、錯誤恢復(fù)、以及接收寫請求。
圖2是表示針對日志的一個分區(qū)的運行和歷史記錄的一個實施例的圖示。所示出的代表性日志分區(qū)包含針對每個寫請求的歷史記錄130a-c。文檔“doc1”的版本2和文檔“doc4”的版本1還具有運行記錄128b-c。運行記錄的存在表示寫請求還沒有被完全復(fù)制到存儲。針對文檔“doc1”的版本1的運行記錄不存在表示已經(jīng)用針對版本1的寫請求更新了所有復(fù)本。在對日志的下一次檢查時,該可擴展最終一致性系統(tǒng)將嘗試將針對文檔“doc1”的版本2和文檔“doc4”的版本1的寫請求傳播至存儲。
針對每個基于文檔的日志分區(qū)124的隊列200是指可擴展最終一致性系統(tǒng)中未完成的寫請求。換句話說,該隊列寬泛地指代還沒有成功地復(fù)制到存儲的運行記錄的集合。日志和存儲的實施例是鍵值存儲系統(tǒng)。在各種實施例中,與運行和歷史記錄相關(guān)聯(lián)的基本信息包括但不限于:分區(qū)鍵值202、行鍵值204、和文檔數(shù)據(jù)206。可以針對每個記錄所存儲的額外的信息可以包括但不限于:充當(dāng)文檔的離線副本的源的文檔的版本(即,針對其生成編輯的版本)、接收到寫請求的日期、接收到寫請求的時間、以及提交寫請求的用戶的用戶標(biāo)識符。
分區(qū)鍵值202標(biāo)識向其分配文檔的分區(qū)。在各種實施例中,分區(qū)鍵值是文檔標(biāo)識符210(例如,文檔名稱)的散列值208,這與將文檔標(biāo)識符用作分區(qū)鍵值相比允許更為高效的最終一致性。散列值允許通過將文檔標(biāo)識符一般化來將具有一系列唯一的文檔標(biāo)識符的文檔分組到相同的分區(qū)中。例如,在所示出的實施例中,文檔標(biāo)識符“doc1”和“doc4”的散列值是“ABC”,并且“doc1”和“doc4”的運行和歷史記錄被分配給對應(yīng)于散列值“ABC”的相同的日志。
行鍵值204是日志內(nèi)唯一的記錄標(biāo)識符。在各種實施例中,行鍵值是附加有記錄的版本212的文檔標(biāo)識符210。可以利用類型標(biāo)識符214來修改行鍵值從而在歷史記錄和運行記錄之間進(jìn)行區(qū)分。例如,可以在行鍵值前加上諸如“H”之類的字符以指示該記錄是歷史記錄、或者在行鍵值前加上“R”以指示該記錄是運行記錄。
文檔數(shù)據(jù)206包括被寫的文檔的內(nèi)容216。在一些實施例中,內(nèi)容可以僅包括改變而不是該文檔的完整副本。
圖3是由可擴展最終一致性系統(tǒng)所采用的最終一致性方法的一個實施的高級流程圖。最終一致性方法300以其中接收到寫請求的文檔寫操作302開始。鍵值操作304計算寫請求的鍵值。該鍵值可以包括如關(guān)于圖2所描述的分區(qū)鍵值和行鍵值。分區(qū)鍵值標(biāo)識向其分配文檔的分區(qū)。行鍵值是唯一的記錄標(biāo)識符。在各種實施例中,該行鍵值是附加有記錄的版本的文檔標(biāo)識符。
歷史操作306將寫請求作為歷史記錄存儲在使用鍵值的日志中。更加具體而言,將該寫請求寫入到由分區(qū)鍵值所標(biāo)識的分區(qū)的日志中。歷史記錄是使用利用歷史記錄指示符所修改的行鍵值而唯一地標(biāo)識的。例如,可以該歷史記錄的在行鍵值前加上諸如“H”之類的字符以指示該記錄是歷史記錄。
運行操作308將寫請求的副本作為運行記錄存儲在使用該鍵值的日志中。更加具體而言,將該寫請求寫入到由分區(qū)鍵值所標(biāo)識的分區(qū)的日志中。運行記錄是使用利用運行記錄指示符所修改的行鍵值而唯一地標(biāo)識的。例如,可以在該運行記錄的行鍵值前加上諸如“R”之類的字符以指示該記錄是運行記錄。
運行記錄處理操作310將寫記錄(即,運行記錄中的編輯)復(fù)制到存儲。運行記錄可以通過運行記錄指示符與其他記錄區(qū)分開來。運行記錄處理操作的各種實施例在每個運行記錄被創(chuàng)建時對其進(jìn)行作用。如果存在未經(jīng)處理的運行記錄(即,未完成的寫請求),則復(fù)制操作312將該寫請求復(fù)制到文檔存儲。
復(fù)制成功檢查操作314驗證已經(jīng)將寫請求成地功復(fù)制到存儲中的合適的分區(qū)。在一些實施例中,可以通過從存儲接收成功或失敗響應(yīng)而指示成功或失敗。在其他實施例中,可以通過將存儲中的分區(qū)的內(nèi)容與寫請求的內(nèi)容進(jìn)行比較來確定成功??梢詫⒃摫容^實現(xiàn)為元數(shù)據(jù)比較(例如,驗證每個復(fù)本的版本號與所處理的寫請求相同)或內(nèi)容比較(例如,散列或逐字節(jié)比較)。
刪除操作316在復(fù)制操作成功完成之后將運行記錄從日志中刪除。刪除運行記錄是已經(jīng)成功地將文檔編輯并入存儲中的信號。盡管運行記錄被刪除,但保留歷史記錄以用于在標(biāo)識沖突編輯以及對沖突解決進(jìn)行幫助時使用。在各種實施例中,可以將歷史記錄無限期地保留在日志中。
在可選的歷史清理操作318中,可以有條件地清理歷史記錄以降低日志的大小。在一些實施例中,針對每個文檔可以僅保留所選擇的數(shù)量的歷史記錄(例如,最后五個)??商娲?,可以在指定時間段(例如,兩周或三個月)之后刪除歷史記錄。在一些實施例中,可以將歷史記錄保留鏈接至與文檔相關(guān)聯(lián)的活動。換句話說,基于文檔的屬性可以保留更多的歷史記錄,所述文檔的屬性例如但不限于最近或頻繁地編輯的文檔。
如果該復(fù)制成功檢查操作確定復(fù)制失敗,則該復(fù)制成功檢查操作可以用于發(fā)起調(diào)度操作320,該調(diào)度操作320使得在所選擇的標(biāo)準(zhǔn)發(fā)生時再次嘗試重復(fù)操作。可以以多種方式來確定成功或失敗。例如,可以由與存儲API建立連接的功能或者由接收到從存儲API所發(fā)送的成功/失敗響應(yīng)來指示,但不限于此。在各種實施例中,該調(diào)度操作可以被配置為使得該復(fù)制操作按照調(diào)度(例如,每天、每小時等)、在經(jīng)過時間之后(例如,在失敗后60分鐘)、或者在事件(例如,接收到新的寫請求)之后進(jìn)行重試,但不限于此。
重試操作322讀取日志文檔分區(qū)并且將存在于該日志中的任何未經(jīng)處理的運行記錄收集到隊列中。運行記錄處理操作310對該隊列中的每個運行記錄進(jìn)行重復(fù)。在各種實施例中,該重試操作從最舊的記錄到最新的記錄來處理該日志。這確保了文檔編輯以它們被接收的順序而被處理,這促成了沖突編輯檢查以及可以依賴于按順序接收寫請求的其他功能。
圖4是可擴展最終一致性系統(tǒng)的一個實施例的流程圖。流程在流程A處以用戶對文檔402進(jìn)行編輯開始。該文檔可以是由用戶所創(chuàng)建的新的文檔或者是已經(jīng)從大規(guī)模服務(wù)所讀取的現(xiàn)有文檔(例如,離線副本)。當(dāng)用戶保存針對文檔的改變時,流程在B處以創(chuàng)建寫請求112繼續(xù)。該寫請求可以包含經(jīng)改變的文檔和額外的信息,例如但不限于:提交寫請求的用戶的用戶標(biāo)識符、提交寫請求的日期、提交寫請求的時間、以及充當(dāng)離線副本的源的文檔的版本(即,離線副本的基線版本)。在流程C處,確定與經(jīng)改變的文檔的文檔標(biāo)識符相對應(yīng)的分區(qū)鍵值。在流程D處,將運行記錄添加至經(jīng)改變的文檔的合適的日志。在流程E處,可以將歷史記錄添加至經(jīng)改變的文檔的合適的日志。在流程F處,在存儲了用戶記錄之后,根據(jù)用戶(per-user)的一致視圖系統(tǒng)向用戶發(fā)送確認(rèn)404。該確認(rèn)向用戶指示已經(jīng)接收并接受了對文檔的改變。
在各種實施例中,在流程G處,將新添加的運行記錄發(fā)送至改變提交層以供復(fù)制到存儲。在流程H處,該改變提交層將運行記錄發(fā)送至存儲API,在這里該運行記錄被傳播至針對對應(yīng)的視圖的合適的存儲分區(qū)。在流程I處,基于運行記錄中的改變來對存儲分區(qū)中針對各種視圖的復(fù)本406a-n進(jìn)行更新。流程在流程J處以將成功或失敗報告回日志API而繼續(xù)。成功/失敗指示408可以源自于存儲API并且可以由該存儲API直接報告給日志API或者通過改變提交層而間接地報告。在其他實施例中,成功/失敗指示408可以由改變提交層來確定并且直接地報告至日志API。如果運行記錄的復(fù)制成功,則流程在K處以刪除成功地復(fù)制的運行記錄128r而繼續(xù)。
流程在L處隨著一致性恢復(fù)層從日志中讀取運行記錄并形成隊列200而繼續(xù)。在流程M處,將經(jīng)排隊的運行記錄發(fā)送至改變提交層以用于以它們被接收的順序來處理。流程針對隊列中的每個運行記錄而從流程H處繼續(xù),并且繼續(xù)直到該隊列中的所有運行記錄都已經(jīng)被處理為止。
圖5A至5D示出了如何在可擴展最終一致性系統(tǒng)內(nèi)對涉及具有各種關(guān)系的文檔的各種事務(wù)(即,編輯)進(jìn)行處理。該可擴展最終一致性系統(tǒng)對隸屬(例如,處于多個項目中的用戶)和包含(例如,作為項目一部分的任務(wù))進(jìn)行建模,并且允許在那些邊界之間移動文檔,而不必將文檔圖(即,數(shù)據(jù)集)細(xì)分成人工規(guī)模單位或區(qū)。
圖5A示出了日志和存儲的初始狀態(tài)。出于討論的目的,所涉及的文檔包括經(jīng)復(fù)制的任務(wù)502、兩個項目504e、504f、以及兩個用戶506a、506b。日志116被示為具有單個分區(qū)124,其假定所涉及的所有文檔的分區(qū)鍵值(例如,散列值)都映射至同一分區(qū);然而,如之前所描述的,一個或多個文檔可以由鍵值指向不同的日志分區(qū)而對操作沒有任何顯著的影響。存儲118被分區(qū)成各種視圖分區(qū),包括個體項目分區(qū)126e、126f、根據(jù)分配的用戶來索引的任務(wù)的分區(qū)126t、以及用于高效的文檔取回的根據(jù)名稱來索引的用戶的分區(qū)126u。例如,可以在存儲中給不同的容器(例如,項目)提供有分離的視圖分區(qū),以允許在單個事務(wù)中取回表示與特定的項目相關(guān)聯(lián)的任務(wù)、資源(例如,用戶)、以及其他對象的各種文檔。文檔可以包括各種獨立的簡單值字段510,例如標(biāo)題或名稱。
一些文檔還可以包括容器關(guān)系字段512,例如項目標(biāo)識符,其將任務(wù)鏈接至另一個文檔(例如,項目)。項目標(biāo)識符可以充當(dāng)指向該任務(wù)所屬的項目(即,容器)的指針,從而定義了容器關(guān)系。通常而言,容器關(guān)系被局限于一對一(例如,任務(wù)屬于一個項目)或一對無(例如,項目不屬于一個項目)關(guān)系。出于說明性目的,將項目示出為具有對文檔標(biāo)識符進(jìn)行鏡像的項目標(biāo)識符以為索引提供公共字段。
一些文檔可以包括隸屬關(guān)系字段514,例如被分配至項目的人員(即,來自分組側(cè)的隸屬)或者用戶與其相關(guān)聯(lián)的項目(即,來自成員側(cè)的隸屬)。通常而言,隸屬關(guān)系除了允許一對一和一對無關(guān)系之外,還允許一對多(例如,項目可以具有多個經(jīng)分配的人員或者用戶可以具有多個角色)。
圖5B示出了在該可擴展最終一致性系統(tǒng)內(nèi)對發(fā)生改變的獨立字段的處理。在這里,對任務(wù)的離線副本502o進(jìn)行工作的用戶102提交了寫請求(即,編輯)112,以將標(biāo)題字段510的值從“Fix A/C”改變?yōu)椤癋ix HVAC”。該編輯被存儲在與該任務(wù)相關(guān)聯(lián)的日志分區(qū)中(即,基于鍵值)。如在本文中所描述的,該標(biāo)題改變最終從日志傳播至存儲的各個分區(qū)中的該任務(wù)的每個復(fù)本502。從日志的角度而言,這樣的事務(wù)能夠容易地被識別為單個文檔事務(wù)。由于該改變限于對單個文檔進(jìn)行,因此所以該事務(wù)無需跨日志中的多個分區(qū)。
圖5C示出了該可擴展最終一致性系統(tǒng)內(nèi)對包含關(guān)系字段改變的處理。在該實例中,對任務(wù)的離線副本502o進(jìn)行工作的用戶102提交了寫請求112,以通過將項目標(biāo)識符字段512的值從“Echo”改變?yōu)椤癋oxtrot”而將該任務(wù)移動至不同的項目。同樣,該編輯被存儲在與任務(wù)相關(guān)聯(lián)的日志分區(qū)中。盡管該編輯涉及包含關(guān)系,但是僅僅任務(wù)(即,所包含的文檔)是必須改變的。該編輯最終被傳播至每個視圖/復(fù)本,這可以涉及從一個或多個分區(qū)中移除復(fù)本、將任務(wù)添加至一個或多個分區(qū)、以及在一個或多個分區(qū)中修改任務(wù)。在這里,從項目E(例如,針對項目E所指定的視圖分區(qū))中移除復(fù)本,并且將復(fù)本添加至項目F(例如,針對項目F所指定的視圖分區(qū))。此外,對視圖分區(qū)中針對根據(jù)受托者來索引的任務(wù)的復(fù)本進(jìn)行更新。然而,不需要對項目(即,容器)進(jìn)行改變。從而,從日志的角度而言,該事務(wù)是單個文檔事務(wù),這是因為僅僅需要針對單個文檔來記錄改變。換句話說,僅盡需要將改變寫入到單個日志分區(qū)。
圖5D示出了該可擴展最終一致性系統(tǒng)內(nèi)對隸屬關(guān)系字段改變的處理。在該實例中,對項目F的離線副本504o進(jìn)行工作的用戶102提交了寫請求112,以通過將“Alice”添加至人員字段514而向與該項目相關(guān)聯(lián)的用戶分組中添加成員。該編輯被存儲在與該項目相關(guān)聯(lián)的日志分區(qū)中。盡管改變最終可以被傳播至存儲中受該隸屬改變所影響的其他文檔,但是從日志的角度而言,對該隸屬關(guān)系字段的隸屬的更新僅僅是對項目的編輯。因此,即使最終結(jié)果可以是對多個文檔進(jìn)行更新(例如,可以對用戶A的隸屬字段進(jìn)行更新),但是將該寫請求作為單個文檔事務(wù)來高效地處理。
該申請的主題可以以多種系統(tǒng)、設(shè)備、和其他制品來實現(xiàn)或者被實踐為方法。實施例可以被實現(xiàn)為硬件、軟件、計算機可讀介質(zhì)或者其組合。在本文中所描述的實施例和功能可以經(jīng)由多種計算系統(tǒng)來操作,所述計算系統(tǒng)包括但不限于:臺式計算機系統(tǒng)、有線和無線計算系統(tǒng)、移動計算系統(tǒng)(例如,移動電話、上網(wǎng)本、平板或板式計算機、以及膝上型計算機)、手持式設(shè)備、多處理器系統(tǒng)、基于微處理器的或可編程的消費型電子產(chǎn)品、小型計算機、以及大型計算機。
各種類型的用戶界面和信息可以經(jīng)由板載計算設(shè)備顯示器或者經(jīng)由與一個或多個計算設(shè)備相關(guān)聯(lián)的遠(yuǎn)程顯示單元來顯示。例如,各種類型的用戶界面和信息可以在各種類型的用戶界面和信息所透射到的墻面上顯示并且與這樣的墻面進(jìn)行交互被投射在其上。與本發(fā)明實施例可以利用其實踐的多種計算系統(tǒng)的交互包括:鍵擊輸入、觸摸屏輸入、語音或其他音頻輸入、在相關(guān)聯(lián)的計算設(shè)備裝備有用于捕捉和解譯用戶手勢的檢測(例如,相機)功能以用于控制計算設(shè)備的功能等的情況下的手勢輸入。
圖6至7B以及相關(guān)聯(lián)的描述提供了對其中可以實踐本發(fā)明的實施例的多種操作環(huán)境的討論。然而,所圖示和討論的設(shè)備和系統(tǒng)是出于示例和說明的目的,而不限于可以用于實踐在本文中所述的本發(fā)明的實施例的大量計算設(shè)備配置。
圖6是示出了利用其可以實踐本發(fā)明的實施例的計算設(shè)備600的物理組件(即,硬件)的框圖。在下文中所描述的計算設(shè)備組件可以適用于實施計算設(shè)備,其包括但不限于:個人計算機、平板計算機、平面計算機和智能電話、或者在文本中所討論的任何其他計算設(shè)備。在基本配置中,計算設(shè)備600可以包括系統(tǒng)存儲器604以及至少一個處理單元602。取決于計算設(shè)備的配置和類型,系統(tǒng)存儲器604可以包括但不限于:易失性存儲(例如,隨機存取存儲器)、非易失性存儲(例如,只讀存儲器)、閃速存儲器、或者這樣的存儲器的任何組合。系統(tǒng)存儲器604可以包括操作系統(tǒng)605和適用于運行軟件應(yīng)用620的一個或多個程序模塊606,例如可擴展最終一致性系統(tǒng)100的組件。例如,操作系統(tǒng)605可以適用于控制計算設(shè)備600的操作。此外,本發(fā)明的實施例可結(jié)合圖形庫、其他操作系統(tǒng)或任何其他應(yīng)用程序來實踐,并且不局限于任何特定的應(yīng)用或系統(tǒng)。由虛線608內(nèi)的那些組件示出了該基本配置。計算設(shè)備600可以具有額外的特征或功能。例如,計算設(shè)備600還可以包括諸如例如磁盤、光盤或磁帶之類的額外的數(shù)據(jù)存儲設(shè)備(可移動的和/或不可移動的)。由可移動存儲設(shè)備609和不可移動存儲設(shè)備610示出了這樣額外的存儲。
如上所述,可以將多個程序模塊和數(shù)據(jù)文件存儲在系統(tǒng)存儲器604中。當(dāng)在處理單元602上執(zhí)行時,軟件應(yīng)用620可以執(zhí)行包括但不限于最終一致性方法300的一個或多個階段的過程??梢愿鶕?jù)本發(fā)明的實施例而使用的其他程序模塊可以包括以下應(yīng)用,例如電子郵件及聯(lián)系人應(yīng)用、文字處理應(yīng)用、電子表格應(yīng)用、數(shù)據(jù)庫應(yīng)用、幻燈片演示應(yīng)用、畫圖或計算機輔助應(yīng)用程序等。
此外,可以在包括分立電子元件的電路、包含邏輯門的封裝或集成的電子芯片、利用微處理器的電路、或者在包含電子元件或微處理器的單個芯片上實現(xiàn)本發(fā)明的實施例。例如,可以經(jīng)由其中所示出的每個或許多組件可以集成在單個集成電路上的片上系統(tǒng)(SOC)來實踐本發(fā)明的實施例。這樣的SOC設(shè)備可以包括一個或多個處理單元、圖形單元、通信單元、系統(tǒng)虛擬化單元、以及各種應(yīng)用功能,其全部作為單個集成電路而被集成(或“燒”)到芯片基底上。當(dāng)經(jīng)由SOC進(jìn)行操作時,可以經(jīng)由在單個集成電路(芯片)上與計算設(shè)備600的其他組件集成的專用邏輯來對在本文中所描述的關(guān)于應(yīng)用620的功能進(jìn)行操作。還可以使用能夠執(zhí)行邏輯操作(例如AND、OR和NOT)的其他技術(shù)來實踐本發(fā)明的實施例,所述其他技術(shù)包括但不限于機械、光學(xué)、流體、和量子技術(shù)。另外,可以在通用計算機內(nèi)或在任何其他任何電路或系統(tǒng)中實踐本發(fā)明的實施例。
計算設(shè)備600還可以具有一個或多個輸入設(shè)備612,例如鍵盤、鼠標(biāo)、筆、語音輸入設(shè)備、觸摸輸入設(shè)備等。還可以包括輸出設(shè)備614,例如顯示器、揚聲器、打印機等。前述設(shè)備是示例并且也可以使用其他設(shè)備。計算設(shè)備600可以包括允許與其他計算設(shè)備618進(jìn)行通信的一個或多個通信連接616。合適的通信連接616的示例包括但不限于:RF發(fā)射機、接收機和/或收發(fā)機電路;通用串行總線(USB)、并行和/或串行端口。
如在本文中所使用的術(shù)語計算機可讀介質(zhì)可以包括計算機存儲介質(zhì)。計算機存儲介質(zhì)可以包括以任何用于存儲信息(例如,計算機可讀指示、數(shù)據(jù)結(jié)構(gòu)、或程序模塊)的方法或技術(shù)來實現(xiàn)的易失性的和非易失性的、可移動的和不可移動的介質(zhì)。系統(tǒng)存儲器604、可移動存儲設(shè)備609、和不可移動存儲設(shè)備610都是計算機存儲介質(zhì)的示例(即,存儲器存儲)。計算機存儲介質(zhì)可以包括RAM、ROM、電可擦只讀存儲器(EEPROM)、閃速存儲器或其他存儲器技術(shù)、CD-ROM、數(shù)字通用盤(DVD)或其他光存儲、盒式磁帶、磁帶、磁盤存儲器或其他磁存儲設(shè)備、或者可用于存儲信息且可以由計算機設(shè)備600訪問的任何其他制品。任何這樣的計算機存儲介質(zhì)都可以是計算設(shè)備600的一部分。
圖7A和7B圖示了利用其可以實踐本發(fā)明的實施例的移動計算設(shè)備700。合適的移動計算設(shè)備的示例包括但不限于:移動電話、智能電話、平板計算機、平面計算機、以及膝上型計算機。在基本配置中,移動計算設(shè)備700是具有輸入元件和輸出元件兩者的手持式計算機。移動計算設(shè)備700通常包括顯示器705以及允許用戶將信息輸入到移動計算設(shè)備700中的一個或多個輸入按鈕710。移動計算設(shè)備700的顯示器705也可以充當(dāng)輸入設(shè)備(例如,觸摸屏顯示器)。如果被包括在內(nèi),則可選的側(cè)輸入元件715允許進(jìn)一步的用戶輸入。側(cè)輸入元715可以是旋轉(zhuǎn)開關(guān)、按鈕、或任何其他類型的手動輸入元件。在可替代的實施例中,移動計算設(shè)備700可包含更多或更少的輸入元件。例如,在一些實施例中,顯示器705可以不是觸摸屏。在另一個可替代的實施例中,移動計算設(shè)備700是諸如蜂窩電話之類的便攜式電話系統(tǒng)。移動計算設(shè)備700還可以包括可選的小鍵盤735。可選的小鍵盤735可以是物理小鍵盤或者是在觸摸屏顯示器上生成的“軟”小鍵盤。在各種實施例中,輸出元件包括用于示出圖形用戶界面(GUI)的顯示器705、視覺指示器720(例如,發(fā)光二極管)、和/或音頻換能器725(例如,揚聲器)。在一些實施例中,移動計算設(shè)備700包含用來向用戶提供觸覺反饋的振動換能器。在另一個實施例中,移動計算設(shè)備700包含用于向外部設(shè)備發(fā)送信號或者從外部設(shè)備接收信號的輸入和/或輸出端口,例如音頻輸入端(例如,麥克風(fēng)插孔)、音頻輸出端(如耳機插孔)、以及視頻輸出端(例如,HDMI端口)。
圖7B是示出了移動計算設(shè)備的一個實施例的架構(gòu)的框圖。即,移動計算設(shè)備700可以包含用于實現(xiàn)一些實施例的系統(tǒng)(即,架構(gòu))702。在一個實施例中,系統(tǒng)702被實現(xiàn)為能夠運行一個或多個應(yīng)用(例如瀏覽器、電子郵件、日歷、聯(lián)系人管理器、消息傳送客戶端、游戲、以及媒體客戶端/播放器)的“智能電話”。在一些實施例中,將系統(tǒng)702集成為諸如集成的個人數(shù)字助理(PDA)和無線電話之類的計算設(shè)備。
一個或多個應(yīng)用程序765可被加載到存儲器762中,并且在操作系統(tǒng)764上運行或者結(jié)合操作系統(tǒng)764運行。應(yīng)用程序的示例包括電話撥號程序、電子郵件程序、個人信息管理(PIM)程序、文字處理程序、電子表格程序、互聯(lián)網(wǎng)瀏覽器程序、消息傳送程序等。系統(tǒng)702還包括存儲器762內(nèi)的非易失性存儲區(qū)768。非易失性存儲區(qū)768可以用于存儲如果系統(tǒng)702斷電而不應(yīng)該丟失的持續(xù)的信息。應(yīng)用程序765可以使用非易失性存儲區(qū)768中的信息并將信息存儲在非易失性存儲區(qū)768中,所述信息例如由電子郵件應(yīng)用等所使用的電子郵件或其他消息。同步應(yīng)用(未示出)也駐留在系統(tǒng)702上并且被編程為與駐留在主機計算機上的對應(yīng)的同步應(yīng)用進(jìn)行交互,以保持存儲在非易失性存儲區(qū)域768中的信息與存儲在主機計算機處的對應(yīng)的信息相同步。應(yīng)當(dāng)理解的是,包括在本文中所描述的軟件應(yīng)用620在內(nèi)的其他應(yīng)用也可被加載到存儲器762中并且在移動計算設(shè)備700上運行。
系統(tǒng)702具有可以被實現(xiàn)為一個或多個電池的電源770。電源770還可以包括外置電源,例如交流的(AC)適配器或給電池供電或充電的加電對接托架。
系統(tǒng)702還可以包括執(zhí)行發(fā)送和接收射頻通信的功能的無線電設(shè)備772。無線電設(shè)備772經(jīng)由通信載波或服務(wù)供應(yīng)商來促成系統(tǒng)702與外部世界之間的無線連通性。來往無線電設(shè)備772的傳輸是在操作系統(tǒng)764的控制下進(jìn)行的。換句話說,可以將由無線電設(shè)備772所接收的通信經(jīng)由操作系統(tǒng)764散播至應(yīng)用程序765,反之亦然。
視覺指示符720可以用于提供視覺通知和/或音頻接口774可以用于經(jīng)由音頻換能器725產(chǎn)生能夠聽到的通知。在所示出的實施例中,視覺指示符720是發(fā)光二極管(LED),而音頻換能器725是揚聲器。這些設(shè)備可直接地耦合至電源770,使得當(dāng)被激活時,即使處理器760和其他組件可以關(guān)閉以節(jié)省電池電量,這些設(shè)備也能保持通電并持續(xù)由通知機制所指示的一段時間。LED可被編程為無限期地保持通電,直到用戶采取動作來指示該設(shè)備的通電狀態(tài)為止。音頻接口774用于向用戶提供能夠聽到的信號并且從用戶處接收能夠聽到的信號。例如,除了耦合至音頻換能器725之外,音頻接口774還可耦合至麥克風(fēng)以接收能夠聽到的輸入,例如,促進(jìn)電話會話。根據(jù)本發(fā)明的實施例,麥克風(fēng)還可以充當(dāng)音頻傳感器以促進(jìn)對通知的控制,如在下文中描述的。系統(tǒng)702還可以包括支持用于記錄靜止的圖像、視頻流等的板載相機730的操作的視頻接口776。
實現(xiàn)系統(tǒng)702的移動計算設(shè)備700可以具有額外的特征或功能。例如,移動計算設(shè)備700還可以包括額外的數(shù)據(jù)存儲設(shè)備(可移動的和/或不可移動的),例如磁盤、光盤、或磁帶。由非易失性存儲區(qū)768示出了這樣額外的存儲設(shè)備。
如在上文中所描述的,可以將由移動計算設(shè)備700所生成或捕獲的數(shù)據(jù)/信息以及經(jīng)由系統(tǒng)702所存儲的數(shù)據(jù)/信息本地地存儲在移動計算設(shè)備700上,或者可以將數(shù)據(jù)存儲在可以經(jīng)由無線電設(shè)備772或經(jīng)由移動計算設(shè)備700和與移動計算設(shè)備700相關(guān)聯(lián)的單獨的計算設(shè)備(例如,分布式計算網(wǎng)絡(luò)(例如,互聯(lián)網(wǎng))中的服務(wù)器計算機)之間的有線連接由設(shè)備來訪問的任何數(shù)量的存儲介質(zhì)上。應(yīng)當(dāng)理解的是,可以經(jīng)由移動計算設(shè)備700、經(jīng)由無線電772、或經(jīng)由分布式計算網(wǎng)絡(luò)來訪問這樣的數(shù)據(jù)/信息。類似地,根據(jù)公知的數(shù)據(jù)/信息傳輸和存儲方式(包括電子郵件和協(xié)同數(shù)據(jù)/信息共享系統(tǒng)),這樣的數(shù)據(jù)/信息可以容易地在計算設(shè)備之間傳輸以供存儲和使用。
在該公開中所提供的一個或多個實施例的描述或圖示旨在向本領(lǐng)域技術(shù)人員提供對主題的完整范圍的完全徹底和完整的公開,而不旨在以任何方式限制或約束所要求保護(hù)的發(fā)明的范圍。在該公開中所提供的實施例、示例、和細(xì)節(jié)被認(rèn)為足以傳達(dá)所有物,并且使得本領(lǐng)域技術(shù)人員能夠制造并使用所要求保護(hù)的發(fā)明的最佳模式。被認(rèn)為是對本領(lǐng)域技術(shù)人員公知的對結(jié)構(gòu)、資源、操作、和行為的描述可以是簡要的或者被省略,以避免使得該申請的主題的較少人知道的或者獨特的方面難以理解。所要求保護(hù)的發(fā)明不應(yīng)該被解釋為限于在該申請中所提供的任何實施例、示例、或細(xì)節(jié)。無論是共同地還是單獨地示出或描述,(結(jié)構(gòu)上和方法上兩者的)各種特征旨在選擇性地包括或省略,以產(chǎn)生具有特定組的特征的實施例。此外,可以以任何順序或者同時地執(zhí)行所示出或描述的功能和行為中的任何一個或全部。在已經(jīng)提供有本申請的描述和圖示之后,本領(lǐng)域技術(shù)人員可以預(yù)想落入在該申請中所實施的一般的發(fā)明概念的更寬泛的方面的精神內(nèi)的變型、修改和替代實施例,而不脫離所要求保護(hù)的發(fā)明的更寬泛的范圍。