分布式應(yīng)用的情節(jié)協(xié)調(diào)模型的制作方法
【專利摘要】各程序?qū)嵗那楣?jié)執(zhí)行與經(jīng)協(xié)調(diào)的消息交換協(xié)議被組合,以實(shí)現(xiàn)分布式系統(tǒng)中各節(jié)點(diǎn)之間的通信的最終一致性。各程序?qū)嵗谇楣?jié)循環(huán)中運(yùn)行,這些情節(jié)循環(huán)通過定義的輸入事件來觸發(fā)并且生成檢查點(diǎn)。這些檢查點(diǎn)指示何時(shí)要將消息從一個(gè)實(shí)例發(fā)送到另一實(shí)例或其他設(shè)備。經(jīng)協(xié)調(diào)的消息交換協(xié)議允許該實(shí)例向接收者發(fā)送消息,以確認(rèn)該消息已被接收并且向接收者證實(shí)該確認(rèn)。
【專利說明】分布式應(yīng)用的情節(jié)協(xié)調(diào)模型
[0001]背景
[0002]分布式應(yīng)用通常在具有多個(gè)節(jié)點(diǎn)的系統(tǒng)上運(yùn)行。分布式應(yīng)用使用各種消息交換來在這些節(jié)點(diǎn)之間進(jìn)行內(nèi)部通信。為維護(hù)總體應(yīng)用的一致狀態(tài),消息交換常常需要第三方協(xié)調(diào)器來確保各個(gè)節(jié)點(diǎn)發(fā)送、接收以及處理這些消息而無故障。如果需要,第三方協(xié)調(diào)器允許整個(gè)交換被回退,并且提供適當(dāng)?shù)难a(bǔ)償邏輯。在典型分布式應(yīng)用中,系統(tǒng)的每一節(jié)點(diǎn)上必需部署并管理分布式事務(wù)協(xié)調(diào)器。開發(fā)者必需明確地選擇加入使用第三方協(xié)調(diào)器程序中的事務(wù)。然而,在諸如云計(jì)算的特定環(huán)境(其中這樣的第三方協(xié)調(diào)器不可用)中,開發(fā)者承擔(dān)確保消息收發(fā)交換中的一致性的負(fù)擔(dān)。
[0003]概述
[0004]狀態(tài)協(xié)調(diào)協(xié)議和情節(jié)執(zhí)行模型(episodic execution model)可被用于實(shí)現(xiàn)分布式應(yīng)用中的最終一致性,而無需分布式事務(wù)協(xié)調(diào)器。這消除了部署和管理分布式事務(wù)協(xié)調(diào)器節(jié)點(diǎn)的負(fù)擔(dān),并且簡(jiǎn)化了編程模型,使得全部消息收發(fā)交互可無縫地參與。各實(shí)施例提供了異步消息收發(fā)系統(tǒng),該系統(tǒng)適于在大規(guī)模云計(jì)算環(huán)境中需要一致性的長(zhǎng)期運(yùn)行的分布式應(yīng)用。該系統(tǒng)可與基于延續(xù)的運(yùn)行時(shí)進(jìn)行組合,以提供依賴于最終一致性的大規(guī)模工作流系統(tǒng)。
[0005]一個(gè)實(shí)施例將程序的情節(jié)執(zhí)行與消息交換協(xié)議進(jìn)行組合,以協(xié)調(diào)分布式應(yīng)用中的節(jié)點(diǎn)的狀態(tài)。利用情節(jié)執(zhí)行與消息交換協(xié)議的組合來實(shí)現(xiàn)分布式系統(tǒng)中各節(jié)點(diǎn)之間的通信的最終一致性。實(shí)例的執(zhí)行作為一系列情節(jié)而發(fā)生。
[0006]在另一實(shí)施例中,情節(jié)執(zhí)行模型將消息狀態(tài)與應(yīng)用狀態(tài)進(jìn)行匹配。該匹配基于應(yīng)用入口點(diǎn)(諸如應(yīng)用級(jí)或系統(tǒng)級(jí)消息),應(yīng)用需要這些入口點(diǎn)來確定它是否準(zhǔn)備好執(zhí)行。程序邏輯被用于將各消息與其對(duì)應(yīng)的應(yīng)用入口點(diǎn)進(jìn)行匹配。在檢查點(diǎn)操作(checkpointing)之前,情節(jié)執(zhí)行模型收集輸出數(shù)據(jù)以及寫入,諸如傳出消息。執(zhí)行的情節(jié)采用消息狀態(tài)和應(yīng)用狀態(tài)一起作為輸入,并且生成一組寫入、一組應(yīng)用恢復(fù)點(diǎn)、和經(jīng)更新的應(yīng)用狀態(tài)。當(dāng)持久狀態(tài)存儲(chǔ)被使用時(shí),這些情節(jié)是冪等的并且容忍機(jī)器或網(wǎng)絡(luò)故障。
[0007]情節(jié)執(zhí)行循環(huán)以匹配事件狀態(tài)開始,在匹配事件狀態(tài)期間該程序等待特定輸入事件。當(dāng)相關(guān)事件被檢測(cè)到時(shí),該情節(jié)開始并且該程序移至執(zhí)行程序狀態(tài)。在執(zhí)行程序狀態(tài)期間,可生成輸出,并且可標(biāo)識(shí)入口點(diǎn)和恢復(fù)點(diǎn)。當(dāng)沒有附加輸入而該程序不能進(jìn)一步前進(jìn)時(shí),該情節(jié)移至檢查點(diǎn)狀態(tài),其中經(jīng)處理的輸入事件、應(yīng)用狀態(tài)、以及相關(guān)消息狀態(tài)被記錄。檢查點(diǎn)狀態(tài)之后,過程移至發(fā)送和證實(shí)狀態(tài),其中在執(zhí)行程序狀態(tài)中標(biāo)識(shí)出的任何傳出消息被發(fā)送。該情節(jié)隨后返回匹配事件狀態(tài)以等待新的輸入事件。這一機(jī)制在該基礎(chǔ)結(jié)構(gòu)內(nèi)運(yùn)行,并且應(yīng)用本身不知曉該基礎(chǔ)結(jié)構(gòu)如何處理這些消息或事件。應(yīng)用生成要發(fā)送的事件或消息,標(biāo)識(shí)它現(xiàn)在愿意接受的各事件或消息,并且標(biāo)識(shí)當(dāng)這些事件或消息之一到達(dá)時(shí)它會(huì)希望返回的某一狀態(tài)。例如,消息可以是要傳被輸至一地址的數(shù)據(jù)片段。應(yīng)用或使用無需關(guān)注該情節(jié)如何被處理,因?yàn)檫@是由基礎(chǔ)結(jié)構(gòu)處理的。
[0008]發(fā)送者發(fā)起的成對(duì)消息交換協(xié)議可被用于狀態(tài)協(xié)調(diào)。消息交換協(xié)議重試、證實(shí)并確認(rèn)發(fā)送和接收消息,同時(shí)檢測(cè)并且丟棄重復(fù)。通過減少一致性所要求的消息數(shù)量以使不需要證實(shí)消息,從而針對(duì)冪等操作來優(yōu)化協(xié)議。
[0009]提供本概述是為了以簡(jiǎn)化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的選擇的概念。本概述并不旨在標(biāo)識(shí)所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于限制所要求保護(hù)主題的范圍。
【專利附圖】
【附圖說明】
[0010]圖1是情節(jié)執(zhí)行循環(huán)的聞級(jí)圖不;
[0011]圖2示出根據(jù)一個(gè)實(shí)施例的發(fā)送者狀態(tài)轉(zhuǎn)變;
[0012]圖3示出根據(jù)一個(gè)實(shí)施例的接收者狀態(tài)轉(zhuǎn)變;
[0013]圖4是根據(jù)一個(gè)實(shí)施例的分布式實(shí)例系統(tǒng)的各組件的高級(jí)框圖;以及
[0014]圖5是根據(jù)一個(gè)實(shí)施例的分布式實(shí)例系統(tǒng)的拓?fù)浣Y(jié)構(gòu)的高級(jí)框圖。
[0015]詳細(xì)描述
[0016]大型計(jì)算系統(tǒng)包括多個(gè)分布式應(yīng)用。各應(yīng)用負(fù)責(zé)對(duì)處理邏輯進(jìn)行處理并執(zhí)行可能持續(xù)數(shù)星期、數(shù)月或甚至數(shù)年的長(zhǎng)期運(yùn)行的業(yè)務(wù)過程。各應(yīng)用是隔離的,除了訪問共享網(wǎng)絡(luò)之外。各應(yīng)用通過在這一網(wǎng)絡(luò)上發(fā)送消息來進(jìn)行通信。這些過程的執(zhí)行通過大量物理計(jì)算資源發(fā)生。分布式應(yīng)用包括大量個(gè)體程序定義。每一程序隔離地執(zhí)行,并且可僅經(jīng)由異步消息交換與其他程序通信。正在執(zhí)行的程序被稱為“實(shí)例”。在任一時(shí)刻,可能存在為程序定義中的任一個(gè)而執(zhí)行的大量個(gè)體實(shí)例。這些實(shí)例是在實(shí)例運(yùn)行時(shí)的管理下被執(zhí)行的。
[0017]個(gè)體“情節(jié)(印isode)”是事件所觸發(fā)的執(zhí)行的運(yùn)行。每一情節(jié)是該實(shí)例的生存期過程中會(huì)發(fā)生的許多情節(jié)之一,它可能跨越數(shù)天、數(shù)月、或甚至數(shù)年。實(shí)例執(zhí)行的每一情節(jié)都是先前情節(jié)的執(zhí)行的邏輯延續(xù)。情節(jié)延續(xù),直到實(shí)例的所有待處理的控制流路徑都在等待更多輸入。在該階段,實(shí)例將完成它能做的事情,并且在等待新輸入時(shí)將變?yōu)榭臻e。在該空閑點(diǎn),實(shí)例被描述成到達(dá)“檢查點(diǎn)”。實(shí)例的狀態(tài)可被保存,以便為下一事件做好準(zhǔn)備。
[0018]情節(jié)通過被稱為“事件”的傳入激勵(lì)來觸發(fā),并且響應(yīng)于該傳入激勵(lì)來運(yùn)行。事件可與當(dāng)前時(shí)間值相關(guān)聯(lián)。事件的執(zhí)行可在任一時(shí)間被取消。如上所述,運(yùn)行情節(jié)的結(jié)果是要用于檢查點(diǎn)操作的一組數(shù)據(jù)。情節(jié)在邏輯上是要在實(shí)例上執(zhí)行的功能。在這一模型中,事件、當(dāng)前時(shí)間、當(dāng)前實(shí)例狀態(tài)以及取消數(shù)據(jù)是該功能的參數(shù),而檢查點(diǎn)數(shù)據(jù)是該功能的返回值。
[0019]檢查點(diǎn)數(shù)據(jù)攜帶實(shí)例的完成狀態(tài),并且攜帶需要與其他實(shí)例交換的任何出站通信數(shù)據(jù)。檢查點(diǎn)過程還擔(dān)當(dāng)對(duì)首先觸發(fā)情節(jié)的事件的確認(rèn)。檢查點(diǎn)數(shù)據(jù)的內(nèi)容是對(duì)系統(tǒng)的持久圖像的更新,并且表示萬一存在某一系統(tǒng)故障的情況下的恢復(fù)點(diǎn)。這些更新(即,檢查點(diǎn)數(shù)據(jù)對(duì)象內(nèi)的所有東西)是按原子方式來作出的,其中要么作出所有改變要么不作出改變。
[0020]在一個(gè)實(shí)施例中,一實(shí)現(xiàn)簡(jiǎn)單地通過將檢查點(diǎn)數(shù)據(jù)保存至持久存儲(chǔ)來處理該檢查點(diǎn)數(shù)據(jù)。另選地,經(jīng)優(yōu)化的實(shí)現(xiàn)可選擇處理多個(gè)情節(jié)并收集各檢查點(diǎn),并且在更新持久存儲(chǔ)之前合并它們。得到檢查點(diǎn)的該情節(jié)表示系統(tǒng)執(zhí)行的工作的粒度最細(xì)的單元。該實(shí)例表示原子改變的最寬范圍。
[0021]實(shí)例控制它接下來愿意運(yùn)行的什么情節(jié)。對(duì)于該實(shí)例愿意運(yùn)行的每一情節(jié),該實(shí)例創(chuàng)建恢復(fù)點(diǎn)對(duì)象。恢復(fù)點(diǎn)對(duì)象被添加到檢查點(diǎn)數(shù)據(jù)中。在一個(gè)實(shí)施例中,通過像用于第一情節(jié)的恢復(fù)點(diǎn)那樣傳遞“空值(null)”來執(zhí)行新實(shí)例的初始化。此外,實(shí)例可簡(jiǎn)單地通過在其最終檢查點(diǎn)內(nèi)返回恢復(fù)點(diǎn)空集來指示已經(jīng)完成。另選地,恢復(fù)點(diǎn)可包含應(yīng)用狀態(tài)和輸出。
[0022]情節(jié)的執(zhí)行可要求某一外部通信,諸如調(diào)用公共web服務(wù)或從數(shù)據(jù)庫中讀取。情節(jié)可使用發(fā)送意圖標(biāo)志來指示它具有要向另一實(shí)例發(fā)送的消息。當(dāng)被設(shè)置時(shí),這一標(biāo)志連同相關(guān)聯(lián)的消息在執(zhí)行時(shí)間被捕捉,并且被存儲(chǔ)為應(yīng)用狀態(tài)的一部分。當(dāng)處理檢查點(diǎn)時(shí),通過實(shí)例運(yùn)行時(shí)來檢查標(biāo)志,以確定是否需要進(jìn)行附加工作或是附加工作需要與實(shí)例執(zhí)行相協(xié)調(diào)。
[0023]消息交換協(xié)議通過發(fā)送者來發(fā)起。發(fā)送者是已到達(dá)檢查點(diǎn)且發(fā)送意圖消息標(biāo)志已設(shè)置的一個(gè)實(shí)例。發(fā)送者首先定義唯一標(biāo)識(shí)符(ID)來表示該消息,并且將這一 ID包括在與該消息相關(guān)聯(lián)的每一后續(xù)交換中,后續(xù)交換諸如發(fā)送該消息以及發(fā)送與該消息相關(guān)聯(lián)的證實(shí)。發(fā)送者在直到它接收到所需確認(rèn)之前不得移至消息發(fā)送協(xié)議中的下一狀態(tài)。發(fā)送者可選擇在適當(dāng)時(shí)并且根據(jù)底層傳輸保證來重放消息(包括證實(shí)消息)。接收者必須用適當(dāng)確認(rèn)來對(duì)傳入消息作出響應(yīng)并且證實(shí)傳入消息。接收者必須總是對(duì)該消息作出響應(yīng)或證實(shí)該消息,而不管該傳入消息是原始消息還是作為重復(fù)被丟棄。重復(fù)檢測(cè)可由接收者基于消息中所提供的唯一 ID來完成。
[0024]消息交換協(xié)議要求底層通信信道可靠并且能夠按次序遞送各消息。例如,TCP和通過HTTP的WS-可靠消息通信(WS-ReliableMessaging)是消息交換協(xié)議的有效通信信道。
[0025]一旦所有外部通信已被完成并被確認(rèn),所得消息狀態(tài)就與應(yīng)用狀態(tài)一起被存儲(chǔ),并且實(shí)例可再次等待新的匹配事件以開始下一情節(jié)。
[0026]圖1是情節(jié)執(zhí)行循環(huán)100的高級(jí)圖示。每一實(shí)例作為一系列離散情節(jié)來執(zhí)行。每一情節(jié)跟隨循環(huán)100中的這些狀態(tài)。在狀態(tài)101,實(shí)例正等待觸發(fā)下一情節(jié)的輸入或事件。程序定義了相關(guān)輸入事件列表。實(shí)例等待這些事件之一,諸如檢測(cè)用戶輸入、接收消息、或出現(xiàn)特定時(shí)間。這些事件可以是例如工作流繼續(xù)執(zhí)行需要的消息。如果接收到的消息與程序的輸入事件之一完全匹配,則情節(jié)可被執(zhí)行。不管是否發(fā)生匹配,待決消息可與現(xiàn)有應(yīng)用狀態(tài)一起被存儲(chǔ)。
[0027]當(dāng)輸入與定義的事件匹配時(shí),情節(jié)可通過移至狀態(tài)102來開始,在狀態(tài)102程序被執(zhí)行。在執(zhí)行期間,加載應(yīng)用狀態(tài)和消息狀態(tài),并且處理輸入事件。隨著程序執(zhí)行,程序可生成傳出消息(諸如去往其他實(shí)例的消息)、或其他輸出(諸如要存儲(chǔ)到存儲(chǔ)器中的圖形或數(shù)據(jù))。這些需要被發(fā)送的傳出消息被記錄為“發(fā)送意圖”,它可影響檢查點(diǎn)上的行為。當(dāng)所有的執(zhí)行分支已進(jìn)展到空閑狀態(tài)并且正等待新的輸入事件時(shí),退出狀態(tài)102。將這些待決輸入事件收集在一起,以便存儲(chǔ)為檢查點(diǎn)的一部分。
[0028]當(dāng)程序執(zhí)行到達(dá)一點(diǎn)時(shí),情節(jié)移至狀態(tài)103,其中在情節(jié)可向前移動(dòng)之前它正等待新事件。在狀態(tài)103,實(shí)例記錄了原始輸入事件已被處理使得該同一事件不會(huì)再次被處理。在檢查點(diǎn)狀態(tài)103,存儲(chǔ)經(jīng)更新的應(yīng)用狀態(tài),以便創(chuàng)建故障情況下的恢復(fù)點(diǎn)。檢查點(diǎn)狀態(tài)103可記錄例如經(jīng)處理的輸入事件、在該情節(jié)期間所生成的輸出列表、應(yīng)用的新狀態(tài)、以及應(yīng)用進(jìn)展到下一情節(jié)所需的新輸入列表。例如,所要求的新輸入事件可以是附加消息或特定時(shí)間的出現(xiàn)。
[0029]在記錄檢查點(diǎn)數(shù)據(jù)之后,情節(jié)移至狀態(tài)104。如果一個(gè)或多個(gè)發(fā)送意圖輸出消息處于待決,則在發(fā)送和證實(shí)狀態(tài)104中發(fā)送這些消息。下面參考圖2和3來定義和描述的消息處理協(xié)議可被用于發(fā)送傳出消息。發(fā)送消息有可能進(jìn)一步涉及(消息狀態(tài)的)檢查點(diǎn)更新。例如,消息狀態(tài)可隨消息被發(fā)送和證實(shí)而被更新。如果情節(jié)沒有為實(shí)例創(chuàng)建任何傳出消息,則可跳過發(fā)送和證實(shí)步驟104。
[0030]在狀態(tài)104中發(fā)送任何傳出消息之后,情節(jié)循環(huán)返回匹配事件階段101,同時(shí)實(shí)例等待將觸發(fā)新情節(jié)的附加事件。
[0031]圖2和3示出根據(jù)一個(gè)實(shí)施例的用于在發(fā)送者實(shí)體與接收者實(shí)體之間協(xié)調(diào)消息交換的協(xié)議。發(fā)送者可以是一個(gè)程序定義的實(shí)例,而接收者可以是相同或不同程序定義的另一實(shí)例。另選地,發(fā)送者和/或接收者可以是某一其他程序模塊、應(yīng)用、或設(shè)備。參考圖1,例如,當(dāng)情節(jié)執(zhí)行循環(huán)100到達(dá)發(fā)送和證實(shí)狀態(tài)104并且實(shí)例具有要針對(duì)當(dāng)前情節(jié)發(fā)送的消息時(shí),圖2中示出的發(fā)送協(xié)議200可被用于將那些消息發(fā)送到接收方實(shí)體。
[0032]在一個(gè)實(shí)施例中,消息發(fā)送協(xié)議200可以用狀態(tài)機(jī)來表示。消息發(fā)送協(xié)議在空閑狀態(tài)201處開始,在空閑狀態(tài)201發(fā)送者等待標(biāo)識(shí)需要被發(fā)送的消息。當(dāng)情節(jié)執(zhí)行循環(huán)已進(jìn)行了檢查點(diǎn)操作(即,情節(jié)循環(huán)到達(dá)狀態(tài)104 (圖1)),并且確定它具有帶有發(fā)送意圖的傳出消息時(shí)(202),則消息發(fā)送協(xié)議從空閑狀態(tài)201移至發(fā)送狀態(tài)203。在發(fā)送狀態(tài)203中,發(fā)送者實(shí)例發(fā)送傳出消息。傳出消息包括消息正文和表示該消息的唯一標(biāo)識(shí)符(ID)。該ID被包括在與該消息相關(guān)聯(lián)的每一交換中,諸如原始消息以及任何確認(rèn)或證實(shí)中。
[0033]在發(fā)送消息之后,消息發(fā)送協(xié)議在發(fā)送狀態(tài)203中等待(204),直到從發(fā)送者接收到確認(rèn)(ACK)消息(205)。該確認(rèn)消息包括消息ID,并且證實(shí)接收者已接收到在發(fā)送狀態(tài)203中所發(fā)送的消息。接收到ACK消息(205)后,消息發(fā)送協(xié)議隨后移至證實(shí)狀態(tài)206。在等待(204)而沒有接收到ACK (205)時(shí),發(fā)送者可決定ACK (205)不會(huì)來臨并且可向接收者重發(fā)原始消息。在移至證實(shí)狀態(tài)206之前,消息發(fā)送協(xié)議再次等待(204)ACK消息(205)。例如,如果預(yù)定等待時(shí)間段過去或底層通信信道存在問題(諸如,如果TCP會(huì)話失敗),則發(fā)送者可決定重試發(fā)送消息。
[0034]在證實(shí)狀態(tài)205中,發(fā)送者向接收者發(fā)送證實(shí)消息,該證實(shí)消息包括原始消息ID。這一證實(shí)消息向接收者通知發(fā)送者(基于確認(rèn)ACK消息(205))知曉接收者已接收到原始消息,并且發(fā)送者完成了該消息。在發(fā)送證實(shí)消息之后,消息發(fā)送協(xié)議在證實(shí)狀態(tài)206中等待
(207),直到從接收者接收到證實(shí)確認(rèn)消息(208)。該證實(shí)確認(rèn)消息(208)還包括消息ID,并且證實(shí)接收者已接收到在證實(shí)狀態(tài)206中所發(fā)送的證實(shí)消息。接收到證實(shí)確認(rèn)消息(208)后,消息發(fā)送協(xié)議隨后移至空閑狀態(tài)201。同樣,在等待(207)而沒有接收到證實(shí)確認(rèn)消息
(208)時(shí),發(fā)送者可決定證實(shí)確認(rèn)消息(208)不會(huì)來臨并且可向接收者重發(fā)該證實(shí)消息。在移至空閑狀態(tài)201之前,消息發(fā)送協(xié)議再次等待(207)證實(shí)確認(rèn)消息(208)。例如,如果預(yù)定時(shí)間過去或者如果通信信道失敗,則發(fā)送者可重發(fā)該證實(shí)消息。
[0035]在某些實(shí)施例中,對(duì)于發(fā)送者,消息收發(fā)狀態(tài)與應(yīng)用狀態(tài)之間存在可任選的附加聯(lián)系。在一個(gè)實(shí)施例中,消息收發(fā)狀態(tài)機(jī)被維護(hù)為應(yīng)用狀態(tài)的一部分。當(dāng)消息收發(fā)狀態(tài)機(jī)轉(zhuǎn)變可用時(shí),諸如當(dāng)在發(fā)送狀態(tài)時(shí)接收到確認(rèn)(ACK) 205時(shí),新的消息發(fā)送狀態(tài)被記錄在應(yīng)用狀態(tài)中。例如,可在應(yīng)用狀態(tài)中設(shè)置標(biāo)志,以指示消息發(fā)送狀態(tài)機(jī)正移至證實(shí)狀態(tài)。例如,該標(biāo)志可以是“移至發(fā)送狀態(tài)意圖”標(biāo)志。一旦對(duì)標(biāo)志進(jìn)行了檢查點(diǎn)操作,則可允許發(fā)生新狀態(tài)中的動(dòng)作——例如,即,發(fā)送證實(shí)。以此方式,協(xié)調(diào)了消息收發(fā)狀態(tài)和應(yīng)用狀態(tài)的當(dāng)前狀況。[0036]另選地,如果消息收發(fā)狀態(tài)機(jī)不作為應(yīng)用狀態(tài)的一部分來維護(hù),則可使用類似機(jī)制將這些消息收發(fā)狀態(tài)機(jī)獨(dú)立地維護(hù)在持久存儲(chǔ)中,以確保在執(zhí)行新狀態(tài)動(dòng)作之前存儲(chǔ)新狀態(tài)。
[0037]圖2中示出的消息發(fā)送協(xié)議作為允許一個(gè)實(shí)例向另一實(shí)例發(fā)送消息或數(shù)據(jù)的四路握手來操作。消息發(fā)送協(xié)議允許發(fā)送消息,證實(shí)該消息已被接收,并且隨后允許發(fā)送者忘記該消息。四路握手被概述在以下步驟中:
[0038]向接收者發(fā)送消息;
[0039]從接收者接收指示該消息已被接收的確認(rèn);
[0040]向接收者發(fā)送發(fā)送者知曉該消息已被接收的證實(shí);以及[0041 ] 從接收者接收指示該證實(shí)已被接收的證實(shí)確認(rèn)。
[0042]該消息、確認(rèn)、證實(shí)、以及證實(shí)確認(rèn)各自包括同一消息標(biāo)識(shí)符(ID)。
[0043]圖2中示出的消息發(fā)送協(xié)議被用于實(shí)例所發(fā)送的每一消息。如果實(shí)例在一情節(jié)期間生成多個(gè)發(fā)送意圖消息,則發(fā)送者可使用單獨(dú)的狀態(tài)機(jī)來跟蹤每一消息的狀況。
[0044]圖3示出根據(jù)一個(gè)實(shí)施例的用于消息接收協(xié)議的狀態(tài)轉(zhuǎn)變。例如,當(dāng)來自發(fā)送者的消息被接收時(shí),接收者將遵循圖3中示出的消息接收協(xié)議。接收者在空閑狀態(tài)301中開始,同時(shí)等待(302)接收到的消息。當(dāng)來自發(fā)送者的消息(303)被接收時(shí),接收者將確認(rèn)(ACK)消息發(fā)送回給發(fā)送者,并且移至接收狀態(tài)304。接收者從該消息中提取消息標(biāo)識(shí)符(ID),并且將該標(biāo)識(shí)符(ID)包括在確認(rèn)消息中。當(dāng)在接收狀態(tài)304時(shí),接收者等待(305)證實(shí)消息。當(dāng)?shù)却?305)時(shí),接收者可被提示在必要時(shí)重發(fā)確認(rèn),以完成與發(fā)送者進(jìn)行的初始消息交換。
[0045]當(dāng)接收者從發(fā)送者接收到證實(shí)消息(306)時(shí),接收者用證實(shí)確認(rèn)消息來響應(yīng),并且移至空閑狀態(tài)301。接收者再次使用消息標(biāo)識(shí)符(ID)將證實(shí)消息與來自發(fā)送者的原始消息相關(guān)聯(lián)。接收者將消息標(biāo)識(shí)符(ID)包括在證實(shí)確認(rèn)消息(306)中。如果被發(fā)送者提示,則接收者可在必要時(shí)重新嘗試發(fā)送證實(shí)確認(rèn)(306)。
[0046]圖3中示出的消息接收協(xié)議被用于實(shí)例所發(fā)送的每一消息。如果接收者接收到多個(gè)消息,則接收者可使用單獨(dú)的狀態(tài)機(jī)來跟蹤每一消息的狀況。
[0047]如上面參考消息發(fā)送協(xié)議狀態(tài)機(jī)所討論的,消息接收協(xié)議的狀態(tài)可與應(yīng)用狀態(tài)相協(xié)調(diào)。例如,在接收側(cè),確認(rèn)消息(303)的傳輸可被延遲,直到接收到的消息被并入應(yīng)用狀態(tài)并且對(duì)接收到的消息進(jìn)行了檢查點(diǎn)操作。
[0048]圖4是根據(jù)一個(gè)實(shí)施例的分布式實(shí)例系統(tǒng)400的各組件的高級(jí)框圖。該分布式實(shí)例系統(tǒng)包括運(yùn)行一應(yīng)用或進(jìn)程的各實(shí)例的一個(gè)或多個(gè)實(shí)例處理器401。實(shí)例管理器402控制實(shí)例處理器401并分配在實(shí)例處理器401上運(yùn)行的特定實(shí)例。實(shí)例管理器402還監(jiān)視每一實(shí)例的生存期并且知道每一實(shí)例何時(shí)開始和結(jié)束。
[0049]各實(shí)例和應(yīng)用狀態(tài)可被存儲(chǔ)在實(shí)例存儲(chǔ)403中。雖然圖4中示出了單個(gè)存儲(chǔ)設(shè)備402,但分布式實(shí)例系統(tǒng)400可包括多個(gè)存儲(chǔ)設(shè)備。在其他實(shí)施例中,作為實(shí)例存儲(chǔ)403的補(bǔ)充或替換,可以使用外部存儲(chǔ)設(shè)備。在一個(gè)實(shí)施例中,每一實(shí)例一次被綁定到一個(gè)存儲(chǔ)設(shè)備403。如所需要的,實(shí)例-存儲(chǔ)綁定可作為再平衡、故障切換、或遷移的一部分來改變。在其他實(shí)施例中,存儲(chǔ)403是可任選的,并且實(shí)例狀態(tài)和消息被存儲(chǔ)在實(shí)例處理器401內(nèi),這可使得該系統(tǒng)工作在降低的可靠性水平上。存儲(chǔ)設(shè)備403的使用可以是按實(shí)例決策,其中一些實(shí)例狀態(tài)和消息可外部化到存儲(chǔ)中,而其他則不會(huì)。各實(shí)例可與相同或不同應(yīng)用或進(jìn)程的其他實(shí)例進(jìn)行通信。
[0050]在實(shí)例處理器401上運(yùn)行的實(shí)例可彼此通信以允許在各實(shí)例之間交換消息。消息存儲(chǔ)404可被用來存儲(chǔ)消息和消息狀態(tài)。實(shí)例管理器402通過消息總線404將消息路由到各系統(tǒng)組件并在各系統(tǒng)組件之間路由消息,如在實(shí)例處理器401、實(shí)例存儲(chǔ)403、以及消息存儲(chǔ)405之間。實(shí)例管理器402實(shí)施在該分布式實(shí)例系統(tǒng)上可用的消息交換模式。
[0051]實(shí)例管理器402負(fù)責(zé)執(zhí)行各實(shí)例的處理邏輯并控制實(shí)例處理器401上的實(shí)例。實(shí)例管理器還管理各實(shí)例的生存期??稍趯?shí)例管理器402和實(shí)例處理器401之間交換控制消息,以創(chuàng)建新實(shí)例和終止已有實(shí)例。實(shí)例管理器負(fù)責(zé)實(shí)現(xiàn)這些命令,并且結(jié)果,知道所有實(shí)例的生存期。實(shí)例管理器還負(fù)責(zé)處理各實(shí)例之間的消息交換。向?qū)嵗芾砥?02提供了與每一消息有關(guān)的附加知識(shí),包括哪一實(shí)例發(fā)送了該消息以及應(yīng)當(dāng)接收該消息的一個(gè)或多個(gè)實(shí)例。
[0052]圖5是根據(jù)一個(gè)實(shí)施例的分布式實(shí)例系統(tǒng)500的拓?fù)浣Y(jié)構(gòu)的高級(jí)框圖。實(shí)例處理器501可被實(shí)現(xiàn)成多個(gè)實(shí)例處理節(jié)點(diǎn)501,每一實(shí)例處理節(jié)點(diǎn)都在實(shí)例管理器502的控制之下。實(shí)例存儲(chǔ)503保持不活動(dòng)時(shí)間段期間的各實(shí)例以及應(yīng)用狀態(tài)和消息狀態(tài)。實(shí)例處理器在系統(tǒng)故障的情況下提供可靠的消息收發(fā)和可恢復(fù)性。然而,如果例如既不要求或需要可靠的消息收發(fā)又不要求或需要持久的實(shí)例,則這些能力中的任一個(gè)可被犧牲。
[0053]實(shí)例管理器502負(fù)責(zé)將各實(shí)例的處理邏輯加載到所分配的實(shí)例處理器501。這允許該系統(tǒng)向應(yīng)用呈現(xiàn)多個(gè)附加的簡(jiǎn)化益處,包括加載處理邏輯的不同版本的能力以及允許各實(shí)例版本的并排執(zhí)行。例如,以實(shí)例的處理邏輯的版本I開始的業(yè)務(wù)進(jìn)程可繼續(xù)使用該版本,即使在創(chuàng)建了版本2的時(shí)候。業(yè)務(wù)進(jìn)程的新實(shí)例可自動(dòng)利用最新版本。
[0054]此外,該系統(tǒng)將業(yè)務(wù)進(jìn)程表示為不同的經(jīng)協(xié)調(diào)的實(shí)例的分層結(jié)構(gòu)的能力極大地降低了正在進(jìn)行的進(jìn)程的變更的影響,從而允許應(yīng)用開發(fā)人員將各進(jìn)程建模成可獨(dú)立地版本化的各實(shí)例的組合。
[0055]對(duì)于非常大型的分布式應(yīng)用,數(shù)百或數(shù)千個(gè)處理單元可被用于在數(shù)千或數(shù)百萬個(gè)實(shí)例處理器上運(yùn)行應(yīng)用的各程序。由于與如此大量處理器和實(shí)例相關(guān)聯(lián)的橫向擴(kuò)展問題,傳統(tǒng)分布式事務(wù)協(xié)調(diào)器不能處理這一分布式應(yīng)用的通信。相反,上面描述的情節(jié)執(zhí)行循環(huán)方法和經(jīng)協(xié)調(diào)的消息交換協(xié)議可被用在這一大規(guī)模系統(tǒng)中,其中不需要分布式事務(wù)協(xié)調(diào)器跟蹤該系統(tǒng)中的所有消息。
[0056]處理單元401、501可以是單獨(dú)的設(shè)備(諸如不同的服務(wù)器、計(jì)算機(jī)、或裝備機(jī)架),或者可以是同一設(shè)備上單獨(dú)的組件(諸如,服務(wù)器或計(jì)算機(jī)中單獨(dú)的處理器,或裝備機(jī)架中單獨(dú)的處理器刀片)。
[0057]本文描述的功能中的許多功能可以用硬件、軟件、和/或固件、和/或其任何組合來實(shí)現(xiàn)。在用軟件實(shí)現(xiàn)時(shí),各代碼段執(zhí)行必要的任務(wù)或步驟。程序或代碼段可被存儲(chǔ)在處理器可讀、計(jì)算機(jī)可讀或及其可讀介質(zhì)中。處理器可讀、計(jì)算機(jī)可讀或機(jī)器可讀介質(zhì)可包括能存儲(chǔ)或轉(zhuǎn)移信息的任何設(shè)備或介質(zhì)。這樣的處理器可讀介質(zhì)的示例包括電路、半導(dǎo)體存儲(chǔ)器設(shè)備、閃存、ROM、可擦除ROM (ER0M)、軟盤、緊致盤、光盤、硬盤、光纖介質(zhì),等等。
[0058]例如,在圖4中,存儲(chǔ)403可以是任何易失性或非易失性存儲(chǔ)設(shè)備,如硬盤驅(qū)動(dòng)器、閃存、固態(tài)存儲(chǔ)器、光盤、CD、DVD、計(jì)算機(jī)程序產(chǎn)品、或向?qū)嵗幚砥?02提供計(jì)算機(jī)可讀或機(jī)器可讀介質(zhì)的其他存儲(chǔ)器設(shè)備。代碼段可以經(jīng)由內(nèi)部總線404、另一計(jì)算機(jī)網(wǎng)絡(luò)(如因特網(wǎng)或內(nèi)聯(lián)網(wǎng))、或經(jīng)由其他有線或無線網(wǎng)絡(luò)等從存儲(chǔ)403下載或轉(zhuǎn)移到實(shí)例處理器402。
[0059]盡管用結(jié)構(gòu)特征和/或方法動(dòng)作專用的語言描述了本主題,但可以理解,所附權(quán)利要求書中定義的主題不必限于上述具體特征或動(dòng)作。更確切而言,上述具體特征和動(dòng)作是作為實(shí)現(xiàn)權(quán)利要求的示例形式公開的。
【權(quán)利要求】
1.一種方法,包括: 在運(yùn)行程序代碼的實(shí)例的處理器處標(biāo)識(shí)事件,所述處理器監(jiān)視與所述實(shí)例相關(guān)聯(lián)的應(yīng)用狀態(tài); 將所述事件與所述應(yīng)用狀態(tài)進(jìn)行比較;以及 當(dāng)所述事件與所述應(yīng)用狀態(tài)匹配時(shí),執(zhí)行所述實(shí)例的執(zhí)行的情節(jié)。
2.如權(quán)利要求1所述的方法,其特征在于,所述執(zhí)行的情節(jié)得到一組輸出、一組應(yīng)用恢復(fù)點(diǎn)、以及經(jīng)更新的應(yīng)用狀態(tài)。
3.如權(quán)利要求2所述的方法,其特征在于,所述執(zhí)行的情節(jié)得到檢查點(diǎn),所述檢查點(diǎn)包括一組輸出、一組應(yīng)用恢復(fù)點(diǎn)、以及經(jīng)更新的應(yīng)用狀態(tài)。
4.如權(quán)利要求1所述的方法,其特征在于,所述執(zhí)行的情節(jié)延續(xù),直到所述實(shí)例中的所有控制流路徑都在等待指定新輸入,所述方法還包括: 監(jiān)視附加事件; 將所述附加事件與所述指定新輸入進(jìn)行比較;以及 當(dāng)附加事件與所述指定 新輸入匹配時(shí),執(zhí)行所述實(shí)例的另一情節(jié)。
5.如權(quán)利要求1所述的方法,其特征在于,將所述事件與所述應(yīng)用狀態(tài)進(jìn)行比較包括: 將消息匹配到應(yīng)用所使用的應(yīng)用恢復(fù)點(diǎn),以確定它是否準(zhǔn)備好執(zhí)行。
6.一種方法,包括: 完成處理器上運(yùn)行的程序代碼的實(shí)例的執(zhí)行的情節(jié); 標(biāo)識(shí)要由所述處理器發(fā)送到一個(gè)或多個(gè)其他實(shí)例的一個(gè)或多個(gè)消息; 將至少一個(gè)消息發(fā)送到另一其他實(shí)例; 從所述其他實(shí)例接收確認(rèn),所述確認(rèn)指示所述至少一個(gè)消息被接收; 將證實(shí)消息發(fā)送到所述其他實(shí)例,所述證實(shí)指示所述確認(rèn)被接收;以及 從所述其他實(shí)例接收證實(shí)確認(rèn),所述證實(shí)確認(rèn)指示所述證實(shí)消息被接收。
7.如權(quán)利要求6所述的方法,還包括: 生成所述至少一個(gè)消息的消息標(biāo)識(shí)符; 將所述消息標(biāo)識(shí)符包括在所述至少一個(gè)消息中以及所述證實(shí)消息中。
8.如權(quán)利要求7所述的方法,還包括: 使用所述消息標(biāo)識(shí)符將所述確認(rèn)消息或所述證實(shí)確認(rèn)消息與所述至少一個(gè)消息相關(guān)聯(lián)。
9.如權(quán)利要求6所述的方法,其特征在于,如果在預(yù)定時(shí)間內(nèi)沒有接收到所述確認(rèn)或所述證實(shí)確認(rèn),則重發(fā)所述至少一個(gè)消息或所述證實(shí)消息。
10.一種存儲(chǔ)用于管理程序代碼的實(shí)例的執(zhí)行的情節(jié)并且支持通過所述實(shí)例進(jìn)行消息收發(fā)的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述指令包括用于以下操作的代碼: 運(yùn)行所述執(zhí)行的情節(jié),直到檢查點(diǎn)被獲得,所述檢查點(diǎn)包括一組輸出、一組應(yīng)用恢復(fù)點(diǎn)、以及經(jīng)更新的應(yīng)用狀態(tài); 標(biāo)識(shí)要由所述處理器發(fā)送到一個(gè)或多個(gè)其他實(shí)例的一個(gè)或多個(gè)消息; 將至少一個(gè)消息發(fā)送到另一其他實(shí)例; 從所述其他實(shí)例接收確認(rèn),所述確認(rèn)指示所述至少一個(gè)消息被接收; 將證實(shí)消息發(fā)送到所述其他實(shí)例,所述證實(shí)指示所述確認(rèn)被接收;以及從所述其他實(shí)例接收證實(shí)確 認(rèn),所述證實(shí)確認(rèn)指示所述證實(shí)消息被接收。
【文檔編號(hào)】G06F9/06GK103562853SQ201280026757
【公開日】2014年2月5日 申請(qǐng)日期:2012年5月29日 優(yōu)先權(quán)日:2011年6月1日
【發(fā)明者】J·泰勒, J·布朗, K·沃爾夫, E·平特, S·巴特雷斯, N·塔爾伯特 申請(qǐng)人:微軟公司