本專利文檔的公開內(nèi)容的一部分包含受版權(quán)保護(hù)的材料。版權(quán)所有者不反對(duì)任何人對(duì)專利文檔或?qū)@_內(nèi)容按照在專利商標(biāo)局的專利文件或記錄中出現(xiàn)的那樣進(jìn)行傳真復(fù)制,但是除此之外在任何情況下都保留所有版權(quán)。
技術(shù)領(lǐng)域
本發(fā)明一般而言涉及計(jì)算機(jī)系統(tǒng),并且具體地涉及支持分布式數(shù)據(jù)網(wǎng)格。
背景技術(shù):
現(xiàn)代計(jì)算系統(tǒng)(尤其是較大的組織和企業(yè)所采用的那些)在規(guī)模和復(fù)雜性上持續(xù)增長(zhǎng)。具體而言,在諸如互聯(lián)網(wǎng)應(yīng)用的領(lǐng)域中,期望數(shù)以百萬計(jì)的用戶能夠同時(shí)訪問該應(yīng)用,這實(shí)際上導(dǎo)致用戶所生成和消費(fèi)的內(nèi)容量以及牽涉該內(nèi)容的事務(wù)量指數(shù)增長(zhǎng)。這些活動(dòng)也造成對(duì)數(shù)據(jù)庫和元數(shù)據(jù)存儲(chǔ)的事務(wù)調(diào)用的數(shù)量對(duì)應(yīng)增長(zhǎng),數(shù)據(jù)庫和元數(shù)據(jù)存儲(chǔ)可能具有有限容量而難以容納該需求。這是本發(fā)明的實(shí)施例旨在解決的一般領(lǐng)域。
技術(shù)實(shí)現(xiàn)要素:
本文描述了支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的系統(tǒng)和方法。分布式數(shù)據(jù)網(wǎng)格包括多個(gè)桶(bucket),其中每個(gè)所述桶被配置為具有包含分布式數(shù)據(jù)結(jié)構(gòu)的若干元素的容量。此外,分布式數(shù)據(jù)網(wǎng)格包括狀態(tài)所有者進(jìn)程,狀態(tài)所有者進(jìn)程被配置為保持分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息并且向客戶端進(jìn)程提供分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息。
本文描述了支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的系統(tǒng)和方法。分布式數(shù)據(jù)網(wǎng)格包括多個(gè)桶,其中每個(gè)所述桶被配置為具有包含分布式數(shù)據(jù)隊(duì)列的若干元素的容量。此外,分布式隊(duì)列可以包括保持分布式隊(duì)列的狀態(tài)信息的本地版本的已命名的隊(duì)列,其中所述狀態(tài)信息的本地版本包含指向分布式數(shù)據(jù)網(wǎng)格中的桶的隊(duì)列的頭指針和尾指針。
附圖說明
圖1是根據(jù)本發(fā)明各種實(shí)施例的數(shù)據(jù)網(wǎng)格集群的示意圖。
圖2顯示了根據(jù)本發(fā)明的實(shí)施例支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的示意圖。
圖3顯示了根據(jù)本發(fā)明的實(shí)施例支持分布式數(shù)據(jù)結(jié)構(gòu)中的桶的示意圖。
圖4顯示了根據(jù)本發(fā)明的實(shí)施例使用客戶端進(jìn)程在分布式數(shù)據(jù)結(jié)構(gòu)上執(zhí)行操作的示意圖。
圖5示出了根據(jù)本發(fā)明的實(shí)施例用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的示例性流程圖。
圖6顯示了根據(jù)本發(fā)明的實(shí)施例支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的示意圖。
圖7顯示了根據(jù)本發(fā)明的實(shí)施例的分布式隊(duì)列中的桶的示意圖。
圖8顯示了根據(jù)本發(fā)明的實(shí)施例向分布式隊(duì)列供給元素的示意圖。
圖9顯示了根據(jù)本發(fā)明的實(shí)施例用于向分布式隊(duì)列供給元素的交互框圖。
圖10顯示了根據(jù)本發(fā)明的實(shí)施例向分布式隊(duì)列中的桶供給元素的交互框圖。
圖11顯示了根據(jù)本發(fā)明的實(shí)施例從分布式隊(duì)列探詢?cè)氐氖疽鈭D。
圖12顯示了根據(jù)本發(fā)明的實(shí)施例用于從分布式隊(duì)列探詢?cè)鼗蛘卟榭丛氐慕换タ驁D。
圖13顯示了根據(jù)本發(fā)明的實(shí)施例用于從分布式隊(duì)列中的桶探詢?cè)鼗蛘卟榭丛氐慕换タ驁D。
圖14示出了根據(jù)本發(fā)明的實(shí)施例用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的示例性流程圖。
具體實(shí)施方式
本文描述了能夠支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的系統(tǒng)和方法。分布式數(shù)據(jù)網(wǎng)格包括多個(gè)桶,其中每一個(gè)桶被配置為具有包含分布式數(shù)據(jù)結(jié)構(gòu)的若干元素的容量。此外,分布式數(shù)據(jù)網(wǎng)格包括狀態(tài)所有者進(jìn)程,狀態(tài)所有者進(jìn)程被配置為保持分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息并且向客戶端進(jìn)程提供分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息。
分布式數(shù)據(jù)網(wǎng)格
根據(jù)實(shí)施例,本文所指的“數(shù)據(jù)網(wǎng)格集群”或者“數(shù)據(jù)網(wǎng)格”是包括多個(gè)計(jì)算機(jī)服務(wù)器的系統(tǒng),該多個(gè)計(jì)算機(jī)服務(wù)器一起工作以管理分布式環(huán)境內(nèi)或者集群式環(huán)境內(nèi)的信息和相關(guān)操作(諸如計(jì)算)。數(shù)據(jù)網(wǎng)格集群可以被用來管理跨服務(wù)器共享的應(yīng)用對(duì)象和數(shù)據(jù)。優(yōu)選地,數(shù)據(jù)網(wǎng)格集群應(yīng)當(dāng)具有低響應(yīng)時(shí)間、高吞吐量、可預(yù)測(cè)的可擴(kuò)展性、持續(xù)的可用性和信息可靠性。作為這些能力的結(jié)果,數(shù)據(jù)網(wǎng)格集群十分適合用于計(jì)算密集型的狀態(tài)中間層應(yīng)用中。數(shù)據(jù)網(wǎng)格集群的一些示例(例如Oracle Coherence數(shù)據(jù)網(wǎng)格集群)可以將信息存儲(chǔ)在存儲(chǔ)器中以實(shí)現(xiàn)更高的性能,并且可以在保有該信息的跨多個(gè)服務(wù)器同步的拷貝中采用冗余,從而確保在服務(wù)器故障的情況下系統(tǒng)的恢復(fù)力以及數(shù)據(jù)的可用性。例如,Coherence在可靠的、高度可擴(kuò)展的點(diǎn)對(duì)點(diǎn)集群協(xié)議之上提供復(fù)制數(shù)據(jù)管理和分布式(分區(qū))數(shù)據(jù)管理以及緩存服務(wù)。
存儲(chǔ)器中的數(shù)據(jù)網(wǎng)格可以通過將數(shù)據(jù)分布在一起工作的若干服務(wù)器上來提供數(shù)據(jù)存儲(chǔ)和管理能力。數(shù)據(jù)網(wǎng)格可以是與應(yīng)用服務(wù)器運(yùn)行在同一層或者運(yùn)行在應(yīng)用服務(wù)器之內(nèi)的中間件。它可以提供數(shù)據(jù)的管理和處理,并且也可以將處理推送到網(wǎng)格中數(shù)據(jù)所位于的地方。此外,通過在服務(wù)器變得不工作或者從網(wǎng)絡(luò)斷開時(shí)自動(dòng)地并且透明地故障轉(zhuǎn)移以及重新分布其集群數(shù)據(jù)管理服務(wù),存儲(chǔ)器中的數(shù)據(jù)網(wǎng)格可以排除單點(diǎn)故障。當(dāng)新的服務(wù)器被添加或者當(dāng)故障的服務(wù)器重啟時(shí),它可以自動(dòng)地加入集群,而服務(wù)可以故障恢復(fù)到它,從而透明地重新分布集群負(fù)載。數(shù)據(jù)網(wǎng)格也可以包括網(wǎng)絡(luò)級(jí)別的容錯(cuò)特性以及透明的軟重啟能力。
根據(jù)實(shí)施例,數(shù)據(jù)網(wǎng)格集群的功能基于使用不同的集群服務(wù)。集群服務(wù)可以包括根集群服務(wù)、分區(qū)緩存服務(wù)以及代理服務(wù)。在數(shù)據(jù)網(wǎng)格集群內(nèi),每一個(gè)集群節(jié)點(diǎn)可以參與若干集群服務(wù),就提供集群服務(wù)和消費(fèi)集群服務(wù)兩者而言。每一個(gè)集群服務(wù)具有在數(shù)據(jù)網(wǎng)格集群內(nèi)唯一地標(biāo)識(shí)該服務(wù)的服務(wù)名稱以及限定該集群服務(wù)能夠做什么的服務(wù)類型。除了運(yùn)行于數(shù)據(jù)網(wǎng)格集群中每一個(gè)集群節(jié)點(diǎn)上的根集群服務(wù),還可以有每一服務(wù)類型的多個(gè)已命名實(shí)例。服務(wù)可以或者由用戶配置,或者作為默認(rèn)的服務(wù)集合由數(shù)據(jù)網(wǎng)格集群提供。
圖1是根據(jù)本發(fā)明的各種實(shí)施例的數(shù)據(jù)網(wǎng)格集群的示意圖。如圖1中所示,數(shù)據(jù)網(wǎng)格集群100(例如Oracle Coherence數(shù)據(jù)網(wǎng)格)包括多個(gè)集群成員(或者服務(wù)器節(jié)點(diǎn)),諸如具有各種集群服務(wù)111-116運(yùn)行其上的集群節(jié)點(diǎn)101-106。此外,緩存配置文件110可以被用來配置數(shù)據(jù)網(wǎng)格集群100。在實(shí)施例中,數(shù)據(jù)網(wǎng)格集群100是存儲(chǔ)器中的數(shù)據(jù)網(wǎng)格集群,其通過將數(shù)據(jù)分布在一起工作的集群節(jié)點(diǎn)的存儲(chǔ)器中來提供數(shù)據(jù)存儲(chǔ)和管理能力。
分布式數(shù)據(jù)結(jié)構(gòu)
根據(jù)本發(fā)明的實(shí)施例,分布式數(shù)據(jù)網(wǎng)格可以支持分布式數(shù)據(jù)結(jié)構(gòu)。例如,分布式數(shù)據(jù)結(jié)構(gòu)可以是分布式隊(duì)列、分布式集合、分布式列表和/或分布式棧。
圖2顯示了根據(jù)本發(fā)明的實(shí)施例支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的示意圖。如圖2中所示,分布式數(shù)據(jù)結(jié)構(gòu)201可以包括多個(gè)桶(例如桶211-216),其中的每一個(gè)桶被配置為包含若干元素。在使用中,桶在不同時(shí)刻可能包含零個(gè)、一個(gè)或者多個(gè)元素。取決于分布式數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,元素可以是包括例如數(shù)據(jù)單元、調(diào)用、請(qǐng)求、響應(yīng)、消息、事務(wù)和/或事件的數(shù)據(jù)元素。
此外,集群200中的狀態(tài)所有者進(jìn)程202可以負(fù)責(zé)保持分布式數(shù)據(jù)結(jié)構(gòu)201的狀態(tài)203。分布式數(shù)據(jù)結(jié)構(gòu)201可以在不同的桶211-216上分別執(zhí)行不同的操作,而不是直接作用于單個(gè)元素上。
如圖2中所示,進(jìn)程的集群(諸如分布式數(shù)據(jù)網(wǎng)格200中的進(jìn)程221-223)可以維護(hù)(或者擁有)多個(gè)桶211-216。例如,桶211-216可以跨進(jìn)程221-223的集群均勻分布,每一個(gè)進(jìn)程負(fù)責(zé)維護(hù)(或者擁有)一個(gè)或多個(gè)桶。因此,分布式數(shù)據(jù)結(jié)構(gòu)201的總大小可以超過單個(gè)進(jìn)程的最大存儲(chǔ)容量,因?yàn)槊恳粋€(gè)進(jìn)程221-223負(fù)責(zé)存儲(chǔ)分布式數(shù)據(jù)結(jié)構(gòu)201的內(nèi)容的僅僅一部分。
根據(jù)本發(fā)明的實(shí)施例,分布式數(shù)據(jù)結(jié)構(gòu)201允許多個(gè)用戶進(jìn)程同時(shí)在分布式結(jié)構(gòu)201中的不同桶211-216上執(zhí)行不同的操作。如圖2所示,操作204可被執(zhí)行于桶211上,同時(shí)另一操作206被執(zhí)行于桶216上。因此,系統(tǒng)可以減少分布式數(shù)據(jù)結(jié)構(gòu)201上的競(jìng)爭(zhēng),因?yàn)樵L問分布式結(jié)構(gòu)201的需求可以被分散到多個(gè)桶上。
此外,分布式數(shù)據(jù)結(jié)構(gòu)201可以確保在任意時(shí)刻只有一個(gè)進(jìn)程能夠訪問單個(gè)桶中的元素。例如,系統(tǒng)可以將鎖機(jī)制應(yīng)用到處于競(jìng)爭(zhēng)下的每一個(gè)單獨(dú)的桶上。替代地,系統(tǒng)可以利用請(qǐng)求隊(duì)列,請(qǐng)求隊(duì)列允許不同的進(jìn)程有序地等待處理。
如圖2中所示,當(dāng)操作204正被執(zhí)行于桶211上時(shí),桶211被鎖定。在同一桶211上的其他操作(諸如操作205)可能需要等待直到完成鎖定操作204。類似地,當(dāng)操作206正被執(zhí)行于桶216上時(shí),桶216被鎖定,并且在同一桶216上的其他操作(諸如操作207)可能需要等待直到完成鎖定操作206。
圖3顯示了根據(jù)本發(fā)明實(shí)施例支持在分布式數(shù)據(jù)結(jié)構(gòu)中的桶的示意圖。如圖3中所示,分布式數(shù)據(jù)網(wǎng)格300中的桶301被配置為包含若干元素并且可以包含用于分布式數(shù)據(jù)結(jié)構(gòu)的一個(gè)或多個(gè)元素(例如內(nèi)部數(shù)據(jù)結(jié)構(gòu)310中的元素311-315)。此外,桶301可以維護(hù)各種桶狀態(tài)303,其可被用于訪問存儲(chǔ)在桶301中的元素311-315。
根據(jù)本發(fā)明的實(shí)施例,桶301被配置為具有容量,容量是它可以包含的元素的最大數(shù)量。桶301因而被配置為包含分布式數(shù)據(jù)結(jié)構(gòu)的若干元素。當(dāng)在使用中時(shí),桶301可以保持零個(gè)到多個(gè)元素(上至容量)。此外,桶301的容量可以被調(diào)節(jié)以支持不同的分布式數(shù)據(jù)結(jié)構(gòu)(以便提高針對(duì)特定的數(shù)據(jù)訪問模式的性能)。
此外,桶301可以被復(fù)制到分布式數(shù)據(jù)網(wǎng)格300中的其他節(jié)點(diǎn)。如圖3中所示,包含一個(gè)或多個(gè)元素(例如內(nèi)部數(shù)據(jù)結(jié)構(gòu)320中的元素321-325)的備用桶302和關(guān)聯(lián)的桶狀態(tài)304可以在桶301丟失時(shí)接管。
圖4顯示了根據(jù)本發(fā)明的實(shí)施例使用客戶端進(jìn)程在分布式數(shù)據(jù)結(jié)構(gòu)上執(zhí)行操作的示意圖。如圖4中所示,分布式數(shù)據(jù)網(wǎng)格400中的分布式數(shù)據(jù)結(jié)構(gòu)401可以包括多個(gè)桶,例如桶411-416。此外,狀態(tài)所有者進(jìn)程402可以負(fù)責(zé)保持分布式數(shù)據(jù)結(jié)構(gòu)401的狀態(tài)信息403。
此外,客戶端進(jìn)程404可以使用(或者包括)已命名的數(shù)據(jù)結(jié)構(gòu)410,其保持分布式數(shù)據(jù)結(jié)構(gòu)401的狀態(tài)信息的本地拷貝405。例如,當(dāng)客戶端進(jìn)程404首次連接到分布式數(shù)據(jù)結(jié)構(gòu)401時(shí),系統(tǒng)可以初始化狀態(tài)信息405。
根據(jù)本發(fā)明的實(shí)施例,多個(gè)客戶端進(jìn)程可以同時(shí)訪問分布式數(shù)據(jù)結(jié)構(gòu)401。當(dāng)另一客戶端進(jìn)程已經(jīng)改變了分布式數(shù)據(jù)結(jié)構(gòu)401的狀態(tài)403時(shí),客戶端進(jìn)程404上的狀態(tài)信息的本地拷貝405可能變?yōu)檫^期的。
使用分布式數(shù)據(jù)結(jié)構(gòu)401,已命名的數(shù)據(jù)結(jié)構(gòu)410中的邏輯(即被客戶端進(jìn)程404所使用的)可以考慮到狀態(tài)405可能是過期的。因此,不需要在每一個(gè)操作之前刷新狀態(tài)信息405。
如圖4中所示,當(dāng)狀態(tài)405變?yōu)檫^期時(shí),(客戶端進(jìn)程404上的)已命名的數(shù)據(jù)結(jié)構(gòu)410可以向狀態(tài)所有者進(jìn)程402發(fā)送消息以刷新狀態(tài)405。在接收到消息之后,狀態(tài)所有者進(jìn)程402可以將新狀態(tài)403發(fā)送回客戶端進(jìn)程404,客戶端進(jìn)程404繼而可以經(jīng)由進(jìn)程421在桶416上執(zhí)行操作420。
根據(jù)本發(fā)明的實(shí)施例,一旦創(chuàng)建了桶,則即使當(dāng)桶變?yōu)榭?即全部的元素已經(jīng)被探詢或者從桶移除),該桶也可能不會(huì)從分布式數(shù)據(jù)結(jié)構(gòu)401移除。這對(duì)于支持多個(gè)客戶端進(jìn)程的操作可以是有益的。
圖5示出了根據(jù)本發(fā)明的實(shí)施例用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式數(shù)據(jù)結(jié)構(gòu)的示例性流程圖。如在圖5中所示,在步驟501處系統(tǒng)可以提供分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶,其中每一個(gè)所述桶被配置為具有包含分布式數(shù)據(jù)結(jié)構(gòu)的若干元素的容量。在使用期間的不同點(diǎn)處,桶可以包含分布式數(shù)據(jù)結(jié)構(gòu)的零個(gè)或者多個(gè)元素(上至容量)。此外,在步驟502處,狀態(tài)所有者進(jìn)程可以保持分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息。隨后,在步驟503處,狀態(tài)所有者進(jìn)程可以向客戶端進(jìn)程提供分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息。
分布式隊(duì)列
根據(jù)本發(fā)明的實(shí)施例,分布式數(shù)據(jù)網(wǎng)格可以支持分布式隊(duì)列。例如,分布式隊(duì)列是隊(duì)列(或者桶)的隊(duì)列,其中每一個(gè)桶是父隊(duì)列中的子隊(duì)列。
圖6顯示了根據(jù)本發(fā)明的實(shí)施例支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的示意圖。如圖6中所示,分布式隊(duì)列601可以包括分布式數(shù)據(jù)網(wǎng)格600中的桶(例如桶611-616)的隊(duì)列。多個(gè)桶(例如桶611-616)中的每一個(gè)桶被配置為包含若干元素。在使用中,在不同時(shí)刻桶可以包含零個(gè)、一個(gè)或者多個(gè)元素。取決于分布式數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,元素可以是包括例如數(shù)據(jù)單元、調(diào)用、請(qǐng)求、響應(yīng)、消息、事務(wù)和/或事件的數(shù)據(jù)元素。
此外,狀態(tài)所有者進(jìn)程602可以負(fù)責(zé)保持分布式隊(duì)列601的狀態(tài)603。例如,狀態(tài)603可以包括指向分布式隊(duì)列601中的當(dāng)前頭桶611的頭指針以及指向分布式隊(duì)列601中的尾桶616的尾指針。
根據(jù)本發(fā)明的實(shí)施例,客戶端進(jìn)程604可以從隊(duì)列狀態(tài)所有者602獲得分布式隊(duì)列601的當(dāng)前狀態(tài)603,以及在分布式隊(duì)列601上執(zhí)行各種操作(諸如供給操作和探詢操作)。
如圖6中所示,可被用戶進(jìn)程606-607訪問的客戶端進(jìn)程604可以使用(或者包括)已命名的隊(duì)列610。已命名的隊(duì)列610可以維護(hù)隊(duì)列狀態(tài)的本地拷貝605,隊(duì)列狀態(tài)的本地拷貝605包括在它看來的頭指針和尾指針。例如,隊(duì)列狀態(tài)605中的頭指針可以指向頭桶611,而隊(duì)列狀態(tài)605中的尾指針可以指向尾桶616。
當(dāng)客戶端進(jìn)程604首次連接到分布式隊(duì)列601時(shí),隊(duì)列狀態(tài)605結(jié)構(gòu)可以被初始化。此外,客戶端進(jìn)程604不需要在每次操作前刷新其隊(duì)列狀態(tài)605,因?yàn)?用于執(zhí)行供給操作和探詢操作的)已命名的610中的邏輯可以考慮到所維護(hù)的隊(duì)列狀態(tài)605可能是過期的。
根據(jù)本發(fā)明的實(shí)施例,客戶端進(jìn)程604可以通過向分布式隊(duì)列601的尾桶616(即尾端)供給(或者添加)一個(gè)或多個(gè)元素來在分布式隊(duì)列601上執(zhí)行供給操作。另外,客戶端進(jìn)程604可以通過從分布式隊(duì)列601的頭桶611(即前端)探詢(或者移除)一個(gè)或多個(gè)元素來在分布式隊(duì)列601上執(zhí)行探詢操作。此外,客戶端進(jìn)程604可以在分布式隊(duì)列601上執(zhí)行查看操作以(在不從分布式隊(duì)列601移除元素的情況下)獲得一個(gè)或多個(gè)元素的值。
此外,不同的客戶端進(jìn)程可以嘗試同時(shí)執(zhí)行不同的操作。圍繞分布式隊(duì)列601的頭桶611和尾桶616可能形成隱式事務(wù)以處置不同客戶端進(jìn)程的多個(gè)請(qǐng)求。系統(tǒng)可以在處于競(jìng)爭(zhēng)下的頭桶611和/或尾桶616上應(yīng)用鎖機(jī)制。替代地,系統(tǒng)可以利用請(qǐng)求隊(duì)列,請(qǐng)求隊(duì)列允許不同進(jìn)程有序地等待處理。
圖7顯示了根據(jù)本發(fā)明的實(shí)施例的分布式隊(duì)列中的桶的示意圖。如圖7中所示,分布式隊(duì)列700中的桶701包含元素的隊(duì)列,例如隊(duì)列710中的元素711-715。
此外,桶701可以維護(hù)各種桶狀態(tài)702,桶狀態(tài)702可以被用于訪問存儲(chǔ)在桶701中的不同元素711-715。桶狀態(tài)702可以包括指向桶701中的頭元素711的指針以及指向桶701中的尾元素716的指針。
此外,可以使用(存儲(chǔ)桶701的)同一進(jìn)程來存儲(chǔ)桶701中的元素711-715。當(dāng)桶701首次創(chuàng)建時(shí),指向頭元素和尾元素的指針可以包含指示桶701為空的專門的值。另外,桶701可以包含指示桶701是否為隊(duì)列中的最后的桶的標(biāo)志。
圖8顯示了根據(jù)本發(fā)明的實(shí)施例向分布式隊(duì)列供給元素的示意圖。如圖8中所示,分布式數(shù)據(jù)網(wǎng)格800中的分布式隊(duì)列801可以包括桶(例如桶811-816)的隊(duì)列,其中每一個(gè)桶可以被配置為具有保持若干元素的容量并且可以在使用期間保持零個(gè)或更多元素。此外,狀態(tài)所有者進(jìn)程802可以負(fù)責(zé)在分布式隊(duì)列801的隊(duì)列狀態(tài)803中保持狀態(tài)信息。
根據(jù)本發(fā)明的實(shí)施例,客戶端進(jìn)程804可以嘗試向如已命名的隊(duì)列810中的如隊(duì)列狀態(tài)805所指示的尾桶供給(或者添加)一個(gè)或多個(gè)元素。例如,客戶端進(jìn)程804可以假定桶815是尾桶,因?yàn)殛?duì)列狀態(tài)805中的尾指針指向桶815。相應(yīng)地,客戶端進(jìn)程804可以向維護(hù)桶815的進(jìn)程821發(fā)送(包含元素集合的)供給消息。
隨后,客戶端進(jìn)程804可以接收對(duì)其消息的響應(yīng)。響應(yīng)的內(nèi)容可以向客戶端進(jìn)程804表明供給操作是否成功。例如,如果響應(yīng)為空,則所有被供給的元素被添加到了尾桶。另一方面,如果響應(yīng)包含任意元素,則這些元素沒有被供給給(添加到)桶。
系統(tǒng)未能向桶供給(或添加)一個(gè)或多個(gè)元素可能有不同的原因。例如,所認(rèn)為的尾桶可能不再是當(dāng)前的尾桶(即隊(duì)列狀態(tài)805是過期的),在此情況下在響應(yīng)中返回全部元素。替代地,當(dāng)前的尾桶可能不具有足夠的剩余容量來保持全部的供給的元素,在此情況下在響應(yīng)消息中返回剩余元素。
在任一情況下,當(dāng)對(duì)供給的響應(yīng)包含未供給的元素時(shí),客戶端進(jìn)程804可能需要知道下一個(gè)尾桶ID是什么。進(jìn)程804可以向擁有隊(duì)列狀態(tài)803的狀態(tài)所有者進(jìn)程802發(fā)送消息,以通知狀態(tài)所有者進(jìn)程802隊(duì)列狀態(tài)803應(yīng)當(dāng)指向下一個(gè)尾桶。
當(dāng)存在多個(gè)客戶端進(jìn)程時(shí),客戶端進(jìn)程804可能不知道另一個(gè)客戶端進(jìn)程是否已經(jīng)移動(dòng)了尾部ID。系統(tǒng)可以將移動(dòng)尾部ID的操作作為原子(atomic)比較和設(shè)置操作來執(zhí)行。
如圖8中所示,當(dāng)客戶端進(jìn)程804請(qǐng)求狀態(tài)所有者進(jìn)程802增加尾部ID時(shí),客戶端進(jìn)程804也可以向狀態(tài)所有者進(jìn)程802發(fā)送隊(duì)列狀態(tài)805中的尾部ID。
當(dāng)隊(duì)列狀態(tài)805中的尾部ID與隊(duì)列狀態(tài)803中的當(dāng)前尾部ID匹配時(shí),系統(tǒng)可以通過將尾部移動(dòng)到下一個(gè)桶ID來改變隊(duì)列狀態(tài)803。隨后,系統(tǒng)可以向客戶端進(jìn)程804發(fā)送更新后的隊(duì)列狀態(tài)803中的尾部ID作為響應(yīng)。
當(dāng)隊(duì)列狀態(tài)805中的尾部ID與隊(duì)列狀態(tài)803中的當(dāng)前尾部ID不匹配時(shí),隊(duì)列狀態(tài)803可能或者已經(jīng)通過此消息被增加,或者此前已經(jīng)被增加過。隨后,系統(tǒng)可以向客戶端進(jìn)程804發(fā)送當(dāng)前隊(duì)列狀態(tài)803中的尾部ID作為響應(yīng)。
例如,如果在客戶端一側(cè)上的尾部ID是10并且在所有者一側(cè)的的尾部ID是10,則在所有者一側(cè)的的尾部ID可以被移動(dòng)到11,此值可以被返回給客戶端。如果在客戶端一側(cè)上的尾部ID是10而在所有者一側(cè)的的尾部ID已經(jīng)是11,則隊(duì)列狀態(tài)所有者可以將值11返回給客戶端。
如圖8中所示,隊(duì)列狀態(tài)803指向新的尾桶816。在客戶端進(jìn)程804接收到正確的尾部ID之后,客戶端進(jìn)程804可以向擁有新的尾桶816的進(jìn)程發(fā)送包含任何剩余的要被供給的元素的供給消息。
此外,新的尾桶816可能不能保持全部供給的元素。例如,另一個(gè)客戶端進(jìn)程可能已經(jīng)填充了新的尾桶816,或者新的尾桶816不具有充足的容量來保持全部元素。隨后,系統(tǒng)可以重復(fù)以上增加尾桶ID和供給剩余元素的過程,直到全部元素已被成功地供給(添加)到分布式隊(duì)列801。
圖9顯示了根據(jù)本發(fā)明的實(shí)施例用于向分布式隊(duì)列供給元素的交互框圖。如圖9中所示,客戶端進(jìn)程901可以使用已命名的隊(duì)列902來向分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列供給(或者添加)一個(gè)或多個(gè)元素。分布式數(shù)據(jù)網(wǎng)格包括集群成員905,集群成員905是擁有隊(duì)列狀態(tài)906的隊(duì)列狀態(tài)所有者905。
在步驟911處,已命名的隊(duì)列902可以(例如從客戶端進(jìn)程901)接收向分布式隊(duì)列的尾部供給新值的消息。與客戶端進(jìn)程901相關(guān)聯(lián)的已命名的隊(duì)列902可以維護(hù)隊(duì)列狀態(tài)903,隊(duì)列狀態(tài)903是分布式隊(duì)列的隊(duì)列狀態(tài)906的本地版本。
已命名的隊(duì)列902可以假定本地隊(duì)列狀態(tài)903中的信息是正確的。在步驟912-913處,已命名的隊(duì)列902可以請(qǐng)求并接收來自本地隊(duì)列狀態(tài)903的隊(duì)列的狀態(tài)信息,諸如尾部ID以及隊(duì)列版本號(hào)。
隨后,與客戶端進(jìn)程901相關(guān)聯(lián)的已命名的隊(duì)列902可以向根據(jù)其本地視角擁有尾桶的集群成員發(fā)送供給消息。在步驟914處,已命名的隊(duì)列902可以將接收到的值供給到基于接收自隊(duì)列狀態(tài)906的尾部ID而擁有尾桶的集群成員904。
如果該值成功地供給(添加)到尾桶,則在步驟915處,集群成員904可以返回空集合,并且在步驟916處,已命名的隊(duì)列902可以向客戶端進(jìn)程901返回OFFER_ACCEPTED消息。
否則,該值未成功地供給(添加)到尾桶,例如由于或者該桶是滿的或者隊(duì)列狀態(tài)版本中的不匹配。在步驟915處,集群成員904可以向已命名的隊(duì)列902返回未供給的元素的集合。隨后已命名的隊(duì)列902可以再次嘗試供給操作,例如通過向下一個(gè)尾桶發(fā)送消息。已命名的隊(duì)列902可以嘗試重復(fù)地(例如在循環(huán)910中)向分布式隊(duì)列添加接收到的值,直到或者分布式隊(duì)列為滿的時(shí)候或者接收到的值成功地被供給(或者添加)。
在循環(huán)910內(nèi),如果此前的供給由于桶為滿或者版本不匹配而失敗,則已命名的隊(duì)列902可能需要刷新或者更新在它看來的尾部ID和隊(duì)列版本。
在步驟917處,已命名的隊(duì)列902可以向本地隊(duì)列狀態(tài)903發(fā)送刷新尾部ID的請(qǐng)求。在步驟918處,本地隊(duì)列狀態(tài)903可以嘗試從是隊(duì)列狀態(tài)906的所有者的集群成員905獲得下一個(gè)尾部ID。例如,消息可以包含基于本地隊(duì)列狀態(tài)903中的這種信息的尾部ID和隊(duì)列版本信息。
在步驟919-920處,集群成員905可以請(qǐng)求并獲得隊(duì)列狀態(tài)906的所有者版本中的狀態(tài)信息。因此,集群成員905可以確定隊(duì)列狀態(tài)是否應(yīng)當(dāng)被刷新,例如通過比較從本地隊(duì)列狀態(tài)903接收到的信息和從隊(duì)列狀態(tài)906接收到的信息。
例如,當(dāng)本地隊(duì)列狀態(tài)903中的信息與所有者隊(duì)列狀態(tài)906中的信息不匹配時(shí),本地隊(duì)列狀態(tài)903是過期的。在這種情況下,所有者隊(duì)列狀態(tài)906中的狀態(tài)信息可以被返回到本地隊(duì)列狀態(tài)903(即本地隊(duì)列狀態(tài)903被刷新)。
當(dāng)本地隊(duì)列狀態(tài)903中的信息與所有者隊(duì)列狀態(tài)906中的信息匹配時(shí),在步驟921處,集群成員905可以更新隊(duì)列狀態(tài)906,例如通過將尾部移動(dòng)到下一個(gè)桶ID。隨后,在步驟922處,隊(duì)列狀態(tài)906可以向集群成員905提供更新后的隊(duì)列的狀態(tài)信息。例如,如果尾部ID通過回卷到第一個(gè)桶ID或者任何其他重復(fù)使用的桶而移動(dòng)到下一個(gè)桶ID,則可以增加隊(duì)列版本號(hào)。
此外,可以執(zhí)行檢查以確定隊(duì)列是否為滿。例如,如果增加尾部ID將使尾部ID等于當(dāng)前頭部ID,則隊(duì)列為滿。
如圖9中所示,在步驟923-924處,集群成員905可以向隊(duì)列狀態(tài)903提供(刷新后或更新后的)隊(duì)列的狀態(tài)信息,隊(duì)列狀態(tài)903繼而可以向已命名的隊(duì)列902提供隊(duì)列的狀態(tài)信息。例如,這些狀態(tài)信息可以包括或者QUEUE_FULL消息或者帶有更新后的隊(duì)列版本號(hào)的更新后的尾部ID。
在步驟925處,當(dāng)分布式隊(duì)列為滿時(shí),已命名的隊(duì)列902可以向客戶端進(jìn)程901發(fā)送QUEUE_FULL消息。否則,在步驟926-927處,已命名的隊(duì)列902可以請(qǐng)求并獲得來自隊(duì)列狀態(tài)903的隊(duì)列的狀態(tài)信息。此外,在步驟928-929處,已命名的隊(duì)列902可以向集群成員904(或者擁有帶有更新后的尾部ID的桶的任何其他集群成員)供給(或者添加)值。
如圖9中所示,已命名的隊(duì)列902可以嘗試重復(fù)地(例如在循環(huán)910中)向分布式隊(duì)列供給(或添加)接收到的值,直到接收到的值被成功地添加。在步驟930處,已命名的隊(duì)列902可以在接收到的值被成功地添加之后向客戶端進(jìn)程901發(fā)送QUEUE_SUCCESS消息。
圖10顯示了根據(jù)本發(fā)明的實(shí)施例用于向分布式隊(duì)列中的桶供給元素的交互框圖。如圖10中所示,調(diào)用者(例如已命名的隊(duì)列1001)可以被用于向分布式數(shù)據(jù)網(wǎng)格中的集群成員1002所擁有的特定桶1003供給(或添加)一個(gè)或多個(gè)元素。
在步驟1011處,已命名的隊(duì)列1001可以基于狀態(tài)信息(諸如桶ID和隊(duì)列版本信息)向集群成員1002供給值。在步驟1012-1013處,如果具有特定桶ID的桶1003不存在,則可以創(chuàng)建新桶。
在步驟1014-1015處,集群成員1002可以檢查桶1003是否為滿。當(dāng)桶為滿時(shí),在步驟1016處,集群成員1002可以向已命名的隊(duì)列1001發(fā)送BUCKET_FULL消息。否則,在步驟1017-1018處,集群成員1002可以從桶1003獲得狀態(tài)信息。
在步驟1019處,如果在已命名的隊(duì)列1001看來的隊(duì)列版本信息不匹配與桶1003相關(guān)聯(lián)的隊(duì)列版本信息,則已命名的隊(duì)列1001可以向已命名的隊(duì)列1001發(fā)送OFFER_FAILED消息。
在步驟1010-1021處,已命名的隊(duì)列1001可以將值添加到桶1003中。隨后,在步驟1022處,已命名的隊(duì)列1001可以向已命名的隊(duì)列1001發(fā)送OFFER_SUCCESS消息。
圖11顯示了根據(jù)本發(fā)明的實(shí)施例從分布式隊(duì)列探詢?cè)氐氖疽鈭D。如圖11中所示,分布式數(shù)據(jù)網(wǎng)格1100中的分布式隊(duì)列1101可以包括桶的隊(duì)列(例如桶1111-1116),其中每一個(gè)桶可以包括一個(gè)或多個(gè)元素。此外,狀態(tài)所有者進(jìn)程1102可以負(fù)責(zé)保持分布式隊(duì)列1101的隊(duì)列狀態(tài)1103的狀態(tài)信息。
根據(jù)本發(fā)明的實(shí)施例,客戶端進(jìn)程1104可以在分布式隊(duì)列1101的頭桶上執(zhí)行探詢動(dòng)作或者查看動(dòng)作。例如,探詢動(dòng)作可以從分布式隊(duì)列1101返回并移除元素(諸如頭元素)。另一方面,查看動(dòng)作可以在不移除頭元素的情況下返回分布式隊(duì)列1101的頭元素的值。
如圖11中所示,客戶端進(jìn)程1104假定桶1111為分布式隊(duì)列1101中的頭桶。為了從分布式隊(duì)列1101探詢,客戶端進(jìn)程1104向擁有頭桶1111的進(jìn)程1121發(fā)送消息。隨后,客戶端進(jìn)程1104可以接收響應(yīng),
該響應(yīng)或者包含來自分布式隊(duì)列1101的頭部的元素,或者包含桶1111為空的指示符。
如果該響應(yīng)指示桶1111為空(假設(shè)分布式隊(duì)列1101本身不為空),則由已命名的隊(duì)列1110維護(hù)的隊(duì)列狀態(tài)1105是過期的。因此,隊(duì)列狀態(tài)1105可能需要被刷新,使得頭桶ID被更新到下一個(gè)頭部ID。
如圖11中所示,隊(duì)列狀態(tài)1104可以向擁有隊(duì)列狀態(tài)1103的狀態(tài)所有者進(jìn)程1102發(fā)送消息以指令隊(duì)列狀態(tài)1103增加頭部ID。用于探詢操作或查看操作的移動(dòng)到下一個(gè)頭部ID的操作(即更新隊(duì)列狀態(tài)1105)可以是原子比較和設(shè)置操作,其中只有在當(dāng)前頭部ID與客戶端頭部ID匹配時(shí)才改變隊(duì)列狀態(tài)1103??蛻舳诉M(jìn)程1104可以隨后接收到包含來自隊(duì)列狀態(tài)1103的頭部ID的響應(yīng),該頭部ID或者已經(jīng)通過此消息被增加,或者此前已經(jīng)被增加過。
最后,客戶端進(jìn)程1104可以向擁有新的頭桶的進(jìn)程重新發(fā)送探詢/查看消息。
圖12顯示了根據(jù)本發(fā)明的實(shí)施例用于從分布式隊(duì)列探詢?cè)鼗蛘卟榭丛氐慕换タ驁D。如圖12中所示,客戶端進(jìn)程1201可以使用已命名的隊(duì)列1202來在分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列1200中的一個(gè)或多個(gè)元素上執(zhí)行諸如探詢動(dòng)作或查看動(dòng)作的動(dòng)作。分布式隊(duì)列1200包括集群成員1205,集群成員1205是擁有隊(duì)列狀態(tài)1206的隊(duì)列狀態(tài)所有者1205。
在步驟1211處,已命名的隊(duì)列1202可以(例如從客戶端進(jìn)程1201)接收在分布式隊(duì)列1200的頭元素上執(zhí)行探詢動(dòng)作或查看動(dòng)作的消息。與客戶端進(jìn)程1201相關(guān)聯(lián)的已命名的隊(duì)列1202可以維護(hù)分布式隊(duì)列1200的隊(duì)列狀態(tài)1203的本地版本。
在步驟1212-1213處,已命名的隊(duì)列1202可以檢查隊(duì)列狀態(tài)1203以獲得關(guān)于分布式隊(duì)列1200是否為空的信息。當(dāng)分布式隊(duì)列1200為空時(shí),在步驟1214處,已命名的隊(duì)列1202可以向客戶端進(jìn)程1201發(fā)送QUEUE_EMPTY消息。
此外,如果隊(duì)列不為空,則客戶端進(jìn)程1201假定它具有當(dāng)前頭部ID和隊(duì)列版本號(hào)。在步驟1215-1216處,已命名的隊(duì)列1202可以請(qǐng)求并接收來自本地隊(duì)列狀態(tài)1203的狀態(tài)信息,諸如頭部ID和隊(duì)列版本號(hào)。已命名的隊(duì)列1202可以使用這些信息來在分布式隊(duì)列1200的頭元素上執(zhí)行探詢動(dòng)作或查看動(dòng)作。
隨后,在步驟1217處,已命名的隊(duì)列1202可以在基于接收到的頭部ID而擁有頭桶的集群成員1204上執(zhí)行探詢動(dòng)作或者查看動(dòng)作。
如果該工作在頭桶上成功執(zhí)行,則在步驟1218處,集群成員1204可以向已命名的隊(duì)列1202返回一個(gè)或多個(gè)元素,并且在步驟1219處,已命名的隊(duì)列1202可以向客戶端進(jìn)程1201返回這些元素。
否則,如果該動(dòng)作未在頭桶上成功執(zhí)行,則在步驟1218處,集群成員1204可以向已命名的隊(duì)列1202返回空集合。在這種情況下,客戶端進(jìn)程1201可能需要更新在它看來的頭部ID和隊(duì)列版本信息。
如圖12中所示,已命名的隊(duì)列1202可以嘗試重復(fù)地(例如在循環(huán)1210中)在分布式隊(duì)列1200的頭部上執(zhí)行探詢動(dòng)作或者查看動(dòng)作,直到或者分布式隊(duì)列1200為空的時(shí)候或者該動(dòng)作被成功執(zhí)行的時(shí)候。
在循環(huán)1210內(nèi),在步驟1220處,已命名的隊(duì)列1202可以請(qǐng)求本地隊(duì)列狀態(tài)1203刷新頭部ID和隊(duì)列版本號(hào),而在步驟1221處本地隊(duì)列狀態(tài)1203可以嘗試從是隊(duì)列狀態(tài)1206的所有者的集群成員1205獲得下一個(gè)頭部ID。
在步驟1222-1223處,集群成員1205可以請(qǐng)求并獲得隊(duì)列狀態(tài)1206中狀態(tài)信息的所有者版本。例如,消息可以包含基于本地隊(duì)列狀態(tài)1203中的信息的頭部ID和隊(duì)列版本信息。因此,集群成員1205可以確定隊(duì)列狀態(tài)是否是過期的,例如通過比較從本地隊(duì)列狀態(tài)1203接收到的信息和從隊(duì)列狀態(tài)1206接收到的信息。
例如,如果本地隊(duì)列狀態(tài)1203中的信息與隊(duì)列狀態(tài)1206中的信息不匹配,則隊(duì)列狀態(tài)1203是過期的。在這種情況下,隊(duì)列狀態(tài)1206中的狀態(tài)信息可以被返回到隊(duì)列狀態(tài)1203(即隊(duì)列狀態(tài)1203被刷新)。
當(dāng)本地隊(duì)列狀態(tài)1203中的信息與隊(duì)列狀態(tài)1206中的信息匹配時(shí),在步驟1224處,集群成員1205可以更新隊(duì)列狀態(tài)1206,例如通過將頭部移動(dòng)到下一個(gè)桶ID。隨后,在步驟1225處,隊(duì)列狀態(tài)1206可以向集群成員1205提供更新后的隊(duì)列狀態(tài)1206的狀態(tài)信息。此外,可以執(zhí)行檢查來確定該隊(duì)列是否為空。例如,當(dāng)頭部ID與尾部ID相同時(shí),分布式隊(duì)列1200為空隊(duì)列,在此情況下頭部ID可以不在尾部ID之上增加。
在步驟1226-1227處,集群成員1205可以向隊(duì)列狀態(tài)1203提供(刷新后的或者更新后的)隊(duì)列的狀態(tài)信息,隊(duì)列狀態(tài)1203繼而可以將該隊(duì)列狀態(tài)信息提供給已命名的隊(duì)列1202。例如,這些狀態(tài)信息可以包括或者QUEUE_EMPTY消息或者帶有更新后的隊(duì)列版本號(hào)的更新后的頭部ID。
在步驟1228-1229處,已命名的隊(duì)列1202可以檢查隊(duì)列狀態(tài)1203以確定分布式隊(duì)列1200是否為空(因?yàn)榭梢栽诜植际疥?duì)列1200上執(zhí)行多個(gè)操作)。在步驟1230處,當(dāng)分布式隊(duì)列1200為空時(shí),已命名的隊(duì)列1202可以向客戶端進(jìn)程1201發(fā)送QUEUE_EMPTY消息。
否則,在步驟1231-1232處,已命名的隊(duì)列1202可以請(qǐng)求并獲得來自隊(duì)列狀態(tài)1203的更新后的隊(duì)列狀態(tài)1203的狀態(tài)信息。在步驟1233-1234處,已命名的隊(duì)列1202可以在集群成員1204(或者擁有帶有更新后的頭部ID的桶的任何其他集群成員)上執(zhí)行探詢動(dòng)作或者查看動(dòng)作。
如圖12中所示,已命名的隊(duì)列1202可以嘗試重復(fù)地(例如在循環(huán)1210中)在分布式隊(duì)列1200的頭部上執(zhí)行探詢動(dòng)作或者查看動(dòng)作,直到該動(dòng)作被成功執(zhí)行。在步驟1235處,已命名的隊(duì)列1202可以向客戶端進(jìn)程1201返回元素。
圖13顯示了根據(jù)本發(fā)明的實(shí)施例從分布式隊(duì)列中的桶探詢?cè)鼗蛘卟榭丛氐慕换タ驁D。如圖13中所示,調(diào)用者(例如已命名的隊(duì)列1301)可以被用于在分布式數(shù)據(jù)網(wǎng)格中的集群成員1302所擁有的桶1303上執(zhí)行諸如探詢操作或者查看操作的動(dòng)作。
在步驟1311處,已命名的隊(duì)列1301可以基于狀態(tài)信息(諸如桶ID和隊(duì)列版本號(hào))在集群成員1302上執(zhí)行探詢動(dòng)作或者查看動(dòng)作。
在步驟1312-1313處,集群成員1302可以檢查桶1303是否為空。在步驟1314處,如果桶1303為空,則集群成員1302可以向已命名的隊(duì)列1301發(fā)送BUCKET_EMPTY消息。
在步驟1315-1316處,集群成員1302可以從桶1003獲得桶的狀態(tài)信息。
在步驟1317處,如果在已命名的隊(duì)列1301看來的隊(duì)列版本信息不匹配與桶1303相關(guān)聯(lián)的隊(duì)列版本信息,則集群成員1302可以向已命名的隊(duì)列1301發(fā)送POLL_FAILED消息。
否則,在步驟1318-1324處,集群成員1302可以在桶1303上執(zhí)行探詢動(dòng)作或者查看動(dòng)作。例如,如果該動(dòng)作是探詢動(dòng)作,則桶1303可以在移除或刪除桶元素1304之前返回桶元素1304的值。此外,如果該桶在桶元素1304被移除或刪除之后變?yōu)榭?,則該桶可以更新隊(duì)列版本。隨后,集群成員1302可以將該元素提供給已命名的隊(duì)列1301。另一方面,如果該動(dòng)作是查看動(dòng)作,則桶1303可以在不移除或不刪除桶元素1304的情況下返回桶元素1304的值。
圖14示出了根據(jù)本發(fā)明的實(shí)施例用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的示例性流程圖。如圖14中所示,在步驟1401處,系統(tǒng)可以提供分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶。隨后,在步驟1402處,系統(tǒng)可以將分布式隊(duì)列的一個(gè)或多個(gè)元素存儲(chǔ)在多個(gè)桶中。此外,在步驟1403處,系統(tǒng)可以使用已命名的隊(duì)列來保持分布式隊(duì)列的狀態(tài)信息的本地版本,其中所述狀態(tài)信息的本地版本包含指向分布式數(shù)據(jù)網(wǎng)格中的桶的隊(duì)列的頭指針和尾指針。
一種用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的系統(tǒng),包括:一個(gè)或多個(gè)微處理器;運(yùn)行在一個(gè)或多個(gè)微處理器上的分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶,其中被維護(hù)在隊(duì)列中的多個(gè)桶被配置來存儲(chǔ)分布式隊(duì)列的一個(gè)或多個(gè)元素;以及保持分布式隊(duì)列的狀態(tài)信息的本地版本的已命名的隊(duì)列,其中所述狀態(tài)信息的本地版本包含指向分布式數(shù)據(jù)網(wǎng)格中的桶的隊(duì)列的頭指針和尾指針。
該系統(tǒng)還包括一種部件,其中已命名的隊(duì)列與客戶端進(jìn)程相關(guān)聯(lián),該客戶端進(jìn)程被一個(gè)或多個(gè)用戶進(jìn)程用來訪問分布式隊(duì)列中的一個(gè)或多個(gè)元素。
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為基于分布式隊(duì)列的狀態(tài)信息的本地版本向桶的隊(duì)列中的尾桶供給一個(gè)或多個(gè)元素。
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為當(dāng)從擁有尾桶的進(jìn)程接收到的消息包括一個(gè)或多個(gè)未供給的元素時(shí)確定隊(duì)列狀態(tài)為過期的。
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為從狀態(tài)所有者進(jìn)程獲得刷新后的隊(duì)列狀態(tài),其中刷新后的隊(duì)列狀態(tài)指示新的頭桶。
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為基于分布式隊(duì)列的狀態(tài)信息的本地版本從桶的隊(duì)列中的頭桶探詢?cè)鼗蛘卟榭丛亍?/p>
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為當(dāng)在分布式隊(duì)列不為空時(shí)從擁有頭桶的進(jìn)程接收到的消息為空時(shí),確定隊(duì)列狀態(tài)是過期的。
該系統(tǒng)還包括一種部件,其中所述客戶端進(jìn)程被配置為從狀態(tài)所有者進(jìn)程獲得刷新后的隊(duì)列狀態(tài),其中刷新后的隊(duì)列狀態(tài)指示新的頭桶。
該系統(tǒng)還包括一種部件,其中每一個(gè)桶維護(hù)桶狀態(tài),桶狀態(tài)包括指向當(dāng)前頭元素的指針以及指向當(dāng)前尾元素的指針,并且當(dāng)執(zhí)行操作時(shí)桶是鎖定的,其中在所述桶上的其他操作被配置為等待直到完成該操作。
一種用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列的方法,包括:提供分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶,其中每一個(gè)桶被配置為存儲(chǔ)分布式隊(duì)列的一個(gè)或多個(gè)元素;將分布式隊(duì)列的一個(gè)或多個(gè)元素存儲(chǔ)在多個(gè)桶中;以及使用已命名的隊(duì)列保持分布式隊(duì)列的狀態(tài)信息的本地版本,其中所述狀態(tài)信息的所述本地版本包含指向分布式數(shù)據(jù)網(wǎng)格中桶的隊(duì)列的頭指針和尾指針。
該方法還包括一種部件,用于將已命名的隊(duì)列與客戶端進(jìn)程相關(guān)聯(lián),該客戶端進(jìn)程被一個(gè)或多個(gè)用戶進(jìn)程用來訪問分布式隊(duì)列中的一個(gè)或多個(gè)元素。
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以基于分布式隊(duì)列的狀態(tài)信息的本地版本向桶的隊(duì)列中的尾桶供給一個(gè)或多個(gè)元素。
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以在從擁有尾桶的進(jìn)程接收到的消息包括一個(gè)或多個(gè)未供給的元素時(shí)確定隊(duì)列狀態(tài)是過期的。
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以從狀態(tài)所有者進(jìn)程獲得刷新隊(duì)列狀態(tài),其中刷新后的隊(duì)列狀態(tài)指示新的頭桶。
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以基于分布式隊(duì)列的狀態(tài)信息的本地版本從桶的隊(duì)列中的頭桶探詢?cè)鼗蛘卟榭丛亍?/p>
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以當(dāng)在分布式隊(duì)列不為空時(shí)從擁有頭桶的進(jìn)程接收到的消息為空時(shí),確定隊(duì)列狀態(tài)是過期的。
該方法還包括一種部件,用于使用所述客戶端進(jìn)程以從狀態(tài)所有者進(jìn)程獲得刷新后的隊(duì)列狀態(tài),其中刷新后的隊(duì)列狀態(tài)指示新的頭桶。
該方法還包括一種部件,用于使用每個(gè)桶維護(hù)桶狀態(tài),該桶狀態(tài)包括指向當(dāng)前頭元素的指針以及指向當(dāng)前尾元素的指針,并且其中當(dāng)執(zhí)行操作時(shí)桶時(shí)桶是鎖定的,其中在所述桶上的其他操作被配置為等待直到完成該操作。
一種具有存儲(chǔ)于其上的指令的非臨時(shí)性機(jī)器可讀存儲(chǔ)介質(zhì),該指令用于支持分布式數(shù)據(jù)網(wǎng)格中的分布式隊(duì)列,該指令被計(jì)算機(jī)系統(tǒng)執(zhí)行時(shí)使得計(jì)算機(jī)系統(tǒng)執(zhí)行包括以下各項(xiàng)的步驟:提供分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶,其中每一個(gè)桶被配置為存儲(chǔ)分布式隊(duì)列的一個(gè)或多個(gè)元素;將分布式隊(duì)列的一個(gè)或多個(gè)元素存儲(chǔ)在多個(gè)桶中;以及使用已命名的隊(duì)列保持分布式隊(duì)列的狀態(tài)信息的本地版本,其中所述狀態(tài)信息的所述本地版本包含指向分布式數(shù)據(jù)網(wǎng)格中桶的隊(duì)列的頭指針和尾指針。
一種用于支持分布式數(shù)據(jù)網(wǎng)格中分布式數(shù)據(jù)結(jié)構(gòu)的裝置,包括:用于提供分布式數(shù)據(jù)網(wǎng)格中的多個(gè)桶的部件,其中每一個(gè)所述桶被配置為具有包含分布式數(shù)據(jù)結(jié)構(gòu)的若干元素的容量;用于經(jīng)由狀態(tài)所有者進(jìn)程保持分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息的部件,以及用于經(jīng)由狀態(tài)所有者進(jìn)程向客戶端進(jìn)程提供分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息的部件。
該裝置還包括用于在分布式數(shù)據(jù)網(wǎng)格中的多個(gè)進(jìn)程之間均勻分布所述多個(gè)桶的部件。
該裝置還包括用于在與分布式數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的不同桶上同時(shí)執(zhí)行多個(gè)操作的部件。
該裝置還包括用于在分布式數(shù)據(jù)結(jié)構(gòu)改變時(shí)更新所述狀態(tài)所有者進(jìn)程分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息的部件。
該裝置還包括用于允許桶在操作被執(zhí)行時(shí)被鎖定的部件,其中所述桶上的其他操作被配置為等待直到完成該操作。
該裝置還包括用于允許分布式數(shù)據(jù)結(jié)構(gòu)為分布式隊(duì)列、分布式集合、分布式列表或者分布式棧的部件。
該裝置還包括用于允許每一個(gè)桶維護(hù)桶狀態(tài)的部件,其中桶狀態(tài)被用來訪問所述桶中的一個(gè)或多個(gè)元素。
該裝置還包括用于關(guān)聯(lián)至少一個(gè)桶與備用桶的部件,備用桶包含被包含在所述至少一個(gè)桶中的一個(gè)或多個(gè)元素。
該裝置還包括允許所述客戶端進(jìn)程進(jìn)行以下操作的部件:存儲(chǔ)分布式數(shù)據(jù)結(jié)構(gòu)的狀態(tài)信息的本地版本;僅當(dāng)狀態(tài)信息的本地版本變得過期時(shí),基于狀態(tài)所有者進(jìn)程所保持的狀態(tài)信息刷新存儲(chǔ)在所述客戶端進(jìn)程中的狀態(tài)信息的本地版本;以及在分布式數(shù)據(jù)結(jié)構(gòu)中的桶中的一個(gè)或多個(gè)元素上執(zhí)行操作。
使用一個(gè)或多個(gè)傳統(tǒng)通用數(shù)字計(jì)算機(jī)或?qū)S脭?shù)字計(jì)算機(jī)、計(jì)算設(shè)備、機(jī)器、或者微處理器(包括根據(jù)本公開的教導(dǎo)編程的一個(gè)或多個(gè)處理器、存儲(chǔ)器和/或計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)),本發(fā)明可以方便地實(shí)現(xiàn)。如軟件領(lǐng)域技術(shù)人員顯而易見的,熟練的編程者基于本公開的教導(dǎo)可以容易地準(zhǔn)備適當(dāng)?shù)能浖幋a。
在一些實(shí)施例中,本發(fā)明包括計(jì)算機(jī)產(chǎn)品,其是具有存儲(chǔ)于其上/中的指令的存儲(chǔ)介質(zhì)或者計(jì)算機(jī)可讀介質(zhì),該指令可被用來編程計(jì)算機(jī)以執(zhí)行本發(fā)明的任何進(jìn)程。存儲(chǔ)介質(zhì)可以包括但不限于任意類型的盤,包括軟盤、光盤、DVD、CD-ROM、微驅(qū)動(dòng)器以及磁光盤、ROM、RAM、EPROM、EEPROM、DRAM、VRAM、閃存存儲(chǔ)器設(shè)備、磁卡或光學(xué)卡、納米系統(tǒng)(包括分子記憶IC)或者適于存儲(chǔ)指令和/或數(shù)據(jù)的任意類型的介質(zhì)或設(shè)備。存儲(chǔ)介質(zhì)或者計(jì)算機(jī)可讀介質(zhì)可以是非臨時(shí)性的。
為了示意和描述的目的,已經(jīng)提供了本發(fā)明的以上描述。它不旨在窮舉或者限制本發(fā)明為所公開的確切形式。對(duì)本領(lǐng)域技術(shù)人員而言,許多修改和變形是顯而易見的。這些修改和變形包括所描述的特性的任意相關(guān)組合。實(shí)施例是為了最好地解釋本發(fā)明的原理及其實(shí)際應(yīng)用而選擇和描述的,從而使得其他本領(lǐng)域技術(shù)人員能夠理解各種實(shí)施例的本發(fā)明以及理解帶有適用于所預(yù)期的特定用途的各種修改的本發(fā)明。本發(fā)明的范圍旨在由以下權(quán)利要求及其等價(jià)物限定。