一種鎖遷移方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種鎖遷移方法及裝置,用以解決現(xiàn)有技術(shù)中現(xiàn)有的鎖遷移過程中任務(wù)會被執(zhí)行兩次,浪費了執(zhí)行任務(wù)所消耗的資源的問題。遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址,并接收執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的請求發(fā)送給第一鎖和第二鎖,當(dāng)接收到的第二鎖返回的結(jié)果是存在結(jié)果時,向執(zhí)行器返回該存在結(jié)果,當(dāng)接收到的第二鎖返回的結(jié)果不是存在結(jié)果時,將接收到的第一鎖返回的結(jié)果返回給執(zhí)行器,遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址。通過上述方法,可避免各執(zhí)行器從第一鎖遷移到第二鎖的過程中重復(fù)執(zhí)行相同的任務(wù)。
【專利說明】一種鎖遷移方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信【技術(shù)領(lǐng)域】,尤其涉及一種鎖遷移方法及裝置。
【背景技術(shù)】
[0002]目前,任務(wù)處理系統(tǒng)在處理一批任務(wù)時,會將這些任務(wù)同時存放在多個任務(wù)隊列中,每個任務(wù)隊列中存放的任務(wù)均是相同的,每個任務(wù)隊列由至少一個執(zhí)行器(worker)來執(zhí)行任務(wù)隊列中的任務(wù),如圖1所示。
[0003]圖1為現(xiàn)有技術(shù)中通過多個任務(wù)隊列和worker處理任務(wù)的示意圖,任務(wù)處理系統(tǒng)包括3個任務(wù)隊列,每個任務(wù)隊列中的任務(wù)由I個worker來執(zhí)行。在執(zhí)行任務(wù)時,用戶可通過客戶端向任務(wù)隊列添加任務(wù),客戶端將同一個任務(wù)添加到3個任務(wù)隊列中,然后worker從任務(wù)隊列中獲取任務(wù)并執(zhí)行。
[0004]由于在如圖1所示的任務(wù)處理系統(tǒng)中,每個任務(wù)隊列中的任務(wù)均相同,因此,為了提高執(zhí)行任務(wù)的效率,保證一個任務(wù)只被執(zhí)行一次,圖1所示的任務(wù)處理系統(tǒng)中還包括一個分布式鎖,即memcache。
[0005]對于一個worker而言,當(dāng)該worker獲取到任務(wù)隊列中的一個任務(wù)時,先向memcache中添加該任務(wù)對應(yīng)的鍵(key)值。而由于memcache的添加操作是互斥的,即,相同的key值只能添加一次,而不能多次添加,因此,當(dāng)worker向memcache中添加該任務(wù)對應(yīng)的key值時,memcache判斷該key值是否存在,若是,則不添加該key值并返回存在結(jié)果(EXISTS),否則,添加該key值并返回成功添加結(jié)果(SUCCESS)。相應(yīng)的,如果worker接收到memcache返回的EXISTS,則說明未取到該任務(wù)的鎖,從而不執(zhí)行該任務(wù),獲取任務(wù)隊列中的下一個任務(wù),如果worker接收到memcache返回的SUCCESS,則說明取到該任務(wù)的鎖,從而執(zhí)行該任務(wù)。
[0006]通過上述方法即可實現(xiàn)一個任務(wù)只被執(zhí)行一次。
[0007]在現(xiàn)有的任務(wù)處理系統(tǒng)中,任務(wù)隊列、worker、memcache往往部署在不同的服務(wù)器上,如果memcache所在的服務(wù)器出現(xiàn)故障,就需要進(jìn)行鎖遷移,S卩,將memcache部署在新的服務(wù)器上。
[0008]在現(xiàn)有技術(shù)中,鎖遷移的方法主要是在新的服務(wù)器上啟動一個新的memcache,將每個worker配置文件中的取鎖目標(biāo)地址由原來的memcache的地址修改為新的memcache的地址,并重啟每個worker,以實現(xiàn)將各執(zhí)行器從原來的memcache遷移到新的memcache上。
[0009]但是,在實際應(yīng)用場景中,由于在修改每個worker配置文件中的取鎖目標(biāo)地址時不可能實現(xiàn)同時對所有的worker配置文件進(jìn)行修改,因此,現(xiàn)有技術(shù)在進(jìn)行鎖遷移的過程中并不能保證一個任務(wù)只執(zhí)行一次,下面舉例進(jìn)行說明。
[0010]例如,3個不同的任務(wù)隊列分別對應(yīng)的worker為workerl、worker2、worker3?,F(xiàn)假設(shè)在鎖遷移過程中,先將workerl配置文件中的取鎖目標(biāo)地址修改為新地址,worker2和worker3暫未修改。如果workerl、worker2、worker3都從各自的任務(wù)隊列中獲取到了相同的任務(wù),記為任務(wù)X,該任務(wù)X未被執(zhí)行過,則此時workerl會向新的memcache取鎖,由于新的memcache中未保存任務(wù)x的key值,因此workerl會取到任務(wù)x的鎖,從而執(zhí)行任務(wù)X,而worker2和worker3會向原來的memcache取鎖,由于該任務(wù)x未被執(zhí)行過,原來的memcache中也未保存任務(wù)x的key值,因此worker2和worker3中的其中一個會取到任務(wù)X的鎖,也會執(zhí)行任務(wù)X。從而,任務(wù)X被執(zhí)行了兩次。
[0011]另外,即使理想情況下可以實現(xiàn)同時對所有的worker配置文件進(jìn)行修改,現(xiàn)有技術(shù)中在進(jìn)行鎖遷移的過程中也不能保證一個任務(wù)只執(zhí)行一次。例如,3個不同的任務(wù)隊列分別對應(yīng)的 worker 為 workerl、worker2、worker3。假設(shè)在 workerl、worker2、worker3 尚未遷移到新的memcache上時,對于任務(wù)x, workerl先獲取并執(zhí)行了該任務(wù)x,此時原來的memcache中保存了任務(wù)x對應(yīng)的key值,而新的memcache并未保存任務(wù)x對應(yīng)的key值,則在 workerl、worker2、worker3 都遷移到新的 memcache 上之后,worker2 或 worker3 又獲取到該任務(wù)X時,會向新的memcache取鎖,由于新的memcache并未保存任務(wù)x對應(yīng)的key值,因此,worker2或worker3會再次執(zhí)行任務(wù)X。
[0012]由上例可以看出,在現(xiàn)有的鎖遷移過程中,同一個任務(wù)會被重復(fù)執(zhí)行。
【發(fā)明內(nèi)容】
[0013]本發(fā)明實施例提供一種鎖遷移方法及裝置,用以解決現(xiàn)有的鎖遷移過程中同一個任務(wù)會被重復(fù)執(zhí)行的問題。
[0014]本發(fā)明實施例提供的一種鎖遷移方法,包括:
[0015]遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述遷移裝置自身的地址;并
[0016]針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的所述請求發(fā)送給所述第一鎖和第二鎖,并接收所述第一鎖和第二鎖返回的結(jié)果;以及
[0017]當(dāng)所述第二鎖返回的是存在結(jié)果時,所述遷移裝置向該執(zhí)行器返回所述存在結(jié)果,當(dāng)所述第二鎖返回的不是存在結(jié)果時,所述遷移裝置向該執(zhí)行器返回接收到的所述第一鎖返回的結(jié)果;
[0018]所述遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址。
[0019]本發(fā)明實施例提供的一種鎖遷移裝置,包括:
[0020]第一修改模塊,用于在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述鎖遷移裝置自身的地址;
[0021]接收轉(zhuǎn)發(fā)模塊,用于針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的所述請求發(fā)送給所述第一鎖和第二鎖,并接收所述第一鎖和第二鎖返回的結(jié)果;以及當(dāng)所述第二鎖返回的是存在結(jié)果時,向該執(zhí)行器返回所述存在結(jié)果,當(dāng)所述第二鎖返回的不是存在結(jié)果時,向該執(zhí)行器返回接收到的所述第一鎖返回的結(jié)果;
[0022]第二修改模塊,用于將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址。
[0023]本發(fā)明實施例提供一種鎖遷移方法及裝置,遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址,并接收執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的請求發(fā)送給第一鎖和第二鎖,當(dāng)接收到的第二鎖返回的結(jié)果是存在結(jié)果時,向執(zhí)行器返回該存在結(jié)果,當(dāng)接收到的第二鎖返回的結(jié)果不是存在結(jié)果時,將接收到的第一鎖返回的結(jié)果返回給執(zhí)行器,遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址。通過上述方法,可避免各執(zhí)行器從第一鎖遷移到第二鎖的過程中重復(fù)執(zhí)行相同的任務(wù)。
【專利附圖】
【附圖說明】
[0024]圖1為現(xiàn)有技術(shù)中通過多個任務(wù)隊列和worker處理任務(wù)的示意圖;
[0025]圖2為本發(fā)明實施例提供的鎖遷移過程;
[0026]圖3為本發(fā)明實施例提供的任務(wù)處理系統(tǒng)結(jié)構(gòu)示意圖;
[0027]圖4為本發(fā)明實施例提供的鎖遷移裝置結(jié)構(gòu)示意圖。
【具體實施方式】
[0028]為了避免執(zhí)行器在從原來的鎖遷移到新鎖的過程中重復(fù)執(zhí)行相同的任務(wù)的問題,本發(fā)明實施例的核心思想是:對于一個任務(wù)來說,原來的鎖和新鎖只要其中一個保存了該任務(wù)對應(yīng)的鍵值,執(zhí)行器就不執(zhí)行該任務(wù),以避免鎖遷移過程中重復(fù)執(zhí)行相同的任務(wù),節(jié)省執(zhí)行任務(wù)所消耗的資源。在具體實現(xiàn)時,本發(fā)明實施例引入遷移裝置,遷移裝置用于在鎖遷移過程中攔截各執(zhí)行器向原來的鎖或新鎖發(fā)送的添加鍵值的請求,并將該添加鍵值的請求轉(zhuǎn)發(fā)給原來的鎖和新鎖,即,同時向原來的鎖和新鎖添加同一個任務(wù)對應(yīng)的鍵值,當(dāng)新鎖返回的是存在結(jié)果時,向執(zhí)行器返回該存在結(jié)果,使執(zhí)行器不執(zhí)行該任務(wù),當(dāng)新鎖返回的不是存在結(jié)果時,向執(zhí)行器返回原來的鎖返回的結(jié)果,使執(zhí)行器根據(jù)原來的鎖返回的結(jié)果確定是否執(zhí)行該任務(wù)。
[0029]下面結(jié)合說明書附圖,對本發(fā)明實施例進(jìn)行詳細(xì)描述。
[0030]圖2為本發(fā)明實施例提供的鎖遷移過程,具體包括以下步驟:
[0031]S201:遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址。
[0032]本發(fā)明實施例中引入遷移裝置,用于在鎖遷移過程中在執(zhí)行器和新舊鎖之間轉(zhuǎn)發(fā)消息。
[0033]在步驟S201中,各執(zhí)行器要從第一鎖遷移到第二鎖,也即,第一鎖為原來的鎖,第二鎖為新鎖。遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址后,后續(xù)各執(zhí)行器無論是向第一鎖發(fā)送添加鍵值的請求,還是向第二鎖發(fā)送添加鍵值的請求,這些請求都會被發(fā)送到遷移裝置。
[0034]具體的,遷移裝置在將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址時,可將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議(Internet Protocol,IP)地址修改為該遷移裝置自身的IP地址,將各執(zhí)行器配置文件中的端口號修改為該遷移裝置自身的端口號。
[0035]S202:針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的請求發(fā)送給第一鎖和第二鎖,并接收第一鎖和第二鎖返回的結(jié)果。
[0036]在步驟S202中,遷移裝置針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,在本發(fā)明實施例中,遷移裝置接收到一個請求后,并不是將該請求發(fā)送給第一鎖或第二鎖中的其中一個,而是將該請求既發(fā)送給第一鎖也發(fā)送給第二鎖,也即,此時執(zhí)行器是通過遷移裝置同時向新舊鎖添加同一個任務(wù)對應(yīng)的鍵值。[0037]遷移裝置將該請求發(fā)送給第一鎖和第二鎖后,接收第一鎖和第二鎖返回的結(jié)果,需要說明的是,本發(fā)明實施例中第一鎖和第二鎖的功能與現(xiàn)有技術(shù)中鎖的功能相同,即,無論是對于第一鎖還是第二鎖,在接收到添加鍵值的請求時,都要判斷自身當(dāng)前是否已經(jīng)保存了該鍵值,若是,則不添加該鍵值并返回存在結(jié)果(EXISTS),否則,添加該鍵值并返回成功添加結(jié)果(SUCCESS)。
[0038]S203:當(dāng)?shù)诙i返回的是存在結(jié)果時,遷移裝置向該執(zhí)行器返回該存在結(jié)果,當(dāng)?shù)诙i返回的不是存在結(jié)果時,遷移裝置向該執(zhí)行器返回接收到的第一鎖返回的結(jié)果。
[0039]在本發(fā)明實施例中,第一鎖和第二鎖也并非是直接向執(zhí)行器返回結(jié)果的,而是將結(jié)果都返回到遷移裝置,遷移裝置則判斷第二鎖(新鎖)返回的是否為存在結(jié)果,若是,則直接向該執(zhí)行器返回該存在結(jié)果,從而執(zhí)行器判定該鍵值對應(yīng)的任務(wù)已經(jīng)被執(zhí)行,不執(zhí)行該任務(wù),繼續(xù)獲取相應(yīng)任務(wù)隊列中的下一個任務(wù),否則,遷移裝置則將接收到的第一鎖(舊鎖)返回的結(jié)果返回給執(zhí)行器,執(zhí)行器可根據(jù)接收到的結(jié)果判定是否執(zhí)行該任務(wù),如果第一鎖返回的結(jié)果是存在結(jié)果,則執(zhí)行器同樣不執(zhí)行該任務(wù),如果第一鎖返回的結(jié)果不是存在結(jié)果,則執(zhí)行器執(zhí)行該任務(wù)。
[0040]S204:遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址。
[0041]遷移裝置最后將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址,完成各執(zhí)行器從第一鎖到第二鎖的遷移。
[0042]具體的,遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址時,可將各執(zhí)行器配置文件中的IP地址修改為第二鎖的IP地址,將各執(zhí)行器配置文件中的端口號修改為第二鎖的端口號。
[0043]在將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址之后,遷移裝置還要重啟各執(zhí)行器。
[0044]需要說明的是,步驟S201中,遷移裝置是不可能同時將所有的執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址的,而是一個一個修改的,同樣的,步驟S204中遷移裝置也不可能同時將所有的執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址,也是一個一個修改的,但無論遷移裝置是否可以同時修改所有執(zhí)行器的取鎖目標(biāo)地址,本發(fā)明實施例提供的上述鎖遷移方法都可以避免同一個任務(wù)被重復(fù)執(zhí)行,下面結(jié)合圖3對上述圖2所示的鎖遷移過程的效果進(jìn)行分析。
[0045]圖3為本發(fā)明實施例提供的任務(wù)處理系統(tǒng)結(jié)構(gòu)示意圖,在圖3中,任務(wù)處理系統(tǒng)包括隊列1、隊列2、隊列3共3個任務(wù)隊列,這3個任務(wù)隊列分別對應(yīng)的執(zhí)行器為workerl、worker2, worker30圖3所示的任務(wù)處理系統(tǒng)中還包括第一鎖、第二鎖和遷移裝置,假設(shè)worker 1> worker2、worker3這3個執(zhí)行器當(dāng)前均從第一鎖中取鎖,現(xiàn)要將這3個執(zhí)行器從第一鎖遷移到第二鎖,則遷移裝置執(zhí)行如圖2所示的方法對這3個執(zhí)行器進(jìn)行遷移。
[0046]那么,在進(jìn)行如圖2所示的鎖遷移過程中,會出現(xiàn)以下幾種情況:
[0047]情況一、在步驟S201之前,也即,遷移裝置未將任何一個執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址之前,各執(zhí)行器均從第一鎖中取鎖,而由于第一鎖的添加操作是互斥的,也即,對于一個鍵值來說,該鍵值只能被添加一次,因此此時對于一個任務(wù)來說,只有一個執(zhí)行器會執(zhí)行該任務(wù),也就是說該任務(wù)只會被執(zhí)行一次。
[0048]情況二、在執(zhí)行步驟S201、S202、S203的過程中,也即,遷移裝置在將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址時,由于不可能同時修改所有執(zhí)行器的取鎖目標(biāo)地址,因此會出現(xiàn)一部分執(zhí)行器的取鎖目標(biāo)地址已經(jīng)被修改為遷移裝置的地址,另一部分執(zhí)行器的取鎖目標(biāo)地址尚未修改(仍是第一鎖的地址)的情況。
[0049]以圖3為例進(jìn)行說明,假設(shè)workerl的取鎖目標(biāo)地址已經(jīng)被修改為遷移裝置的地址,worker2、worker3的取鎖目標(biāo)地址仍是第一鎖的地址。
[0050]此時,對于一個任務(wù)X,如果workerl先獲取到這個任務(wù),則會向遷移裝置發(fā)送添加該任務(wù)X對應(yīng)的鍵值的請求,遷移裝置則向第一鎖和第二鎖發(fā)送該請求。假設(shè)任務(wù)X未被執(zhí)行過,則第一鎖和第二鎖中都未保存該任務(wù)X對應(yīng)的鍵值,因此,第一鎖和第二鎖都會添加該任務(wù)X對應(yīng)的鍵值,向遷移裝置返回的結(jié)果都不是存在結(jié)果。而遷移裝置接收到的第二鎖返回的結(jié)果不是存在結(jié)果,則將第一鎖返回的結(jié)果返回給workerl,第一鎖返回的結(jié)果也不是存在結(jié)果,因此workerl執(zhí)行該任務(wù)X。后續(xù)如果worker2又獲取到該任務(wù)x,由于workerf的取鎖目標(biāo)地址仍是第一鎖的地址,因此直接向第一鎖發(fā)送添加任務(wù)X對應(yīng)的鍵值的請求,而由于此時第一鎖中已經(jīng)添加了任務(wù)X對應(yīng)的鍵值,因此,第一鎖向worker2返回的結(jié)果是存在結(jié)果,從而worker2不執(zhí)行任務(wù)x,繼續(xù)獲取下一個任務(wù)。
[0051]相反的,如果worker2先獲取到任務(wù)x,則由于worker2的取鎖目標(biāo)地址仍是第一鎖的地址,worker2就會直接向第一鎖發(fā)送添加任務(wù)x對應(yīng)的鍵值的請求。仍假設(shè)任務(wù)x未被執(zhí)行過,則第一鎖和第二鎖中都未保存任務(wù)X對應(yīng)的鍵值,因此第一鎖添加任務(wù)X對應(yīng)的鍵值,向worker2返回的結(jié)果也不是存在結(jié)果,worker2接收到該結(jié)果后,執(zhí)行該任務(wù)X。后續(xù)如果workerl又獲取到該任務(wù)x,則會向遷移裝置發(fā)送添加該任務(wù)x對應(yīng)的鍵值的請求,遷移裝置則向第一鎖和第二鎖發(fā)送該請求,由于此時第二鎖中未保存任務(wù)X對應(yīng)的鍵值,因此第二鎖向遷移裝置返回的結(jié)果不是存在結(jié)果,但此時第一鎖中已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此第一鎖向遷移裝置返回的結(jié)果是存在結(jié)果。遷移裝置接收到的第二鎖返回的結(jié)果不是存在結(jié)果,因此將第一鎖返回的結(jié)果返回給workerl,而由于第一鎖返回的結(jié)果是存在結(jié)果,因此workerl接收到該結(jié)果后不執(zhí)行任務(wù)X,繼續(xù)獲取下一個任務(wù)。
[0052]可見,在情況二中,任務(wù)X并未被重復(fù)執(zhí)行。
[0053]情況三、步驟S201執(zhí)行完成后,也即,遷移裝置已經(jīng)將所有執(zhí)行器的取鎖目標(biāo)地址都修改為該遷移裝置自身的地址后,所有的執(zhí)行器都通過遷移裝置向第一鎖和第二鎖進(jìn)行取鎖。
[0054]此時,由于情況二中一部分執(zhí)行器是直接將添加鍵值的請求發(fā)送給第一鎖,另一部分執(zhí)行器是通過遷移裝置將添加鍵值的請求發(fā)送給第一鎖和第二鎖,因此,在情況三中,對于一個任務(wù)來說,該任務(wù)對應(yīng)的鍵值要么同時存在于第一鎖和第二鎖,要么只存在于第一鎖中。
[0055]以圖3為例進(jìn)行說明,假設(shè)workerl、worker2、worker3的取鎖目標(biāo)地址均是遷移裝置的地址。
[0056]對于任務(wù)X,如果workerl的取鎖目標(biāo)地址在被修改成遷移裝置的地址之前就已經(jīng)執(zhí)行了任務(wù)X,那么,任務(wù)X對應(yīng)的鍵值就只存在于第一鎖中,而不存在于第二鎖中。此時,假設(shè)worker2又獲取到任務(wù)x,向遷移裝置發(fā)送添加任務(wù)x對應(yīng)的鍵值的請求,該請求會被遷移裝置發(fā)送給第一鎖和第二鎖,而由于第二鎖中未保存任務(wù)X對應(yīng)的鍵值,因此添加該任務(wù)X對應(yīng)的鍵值,向遷移裝置返回的結(jié)果不是存在結(jié)果,但第一鎖中已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此返回的結(jié)果是存在結(jié)果。而遷移裝置接收到的第二鎖返回的結(jié)果不是存在結(jié)果,因此將第一鎖返回的結(jié)果返回給workerf,由于第一鎖返回的結(jié)果是存在結(jié)果,因此,worker2不執(zhí)行任務(wù)X。后續(xù)如果worker3又獲取到任務(wù)x,則由于第二鎖中也已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此向遷移裝置返回的結(jié)果是存在結(jié)果,從而遷移裝置直接向worker3返回存在結(jié)果,worker3也不執(zhí)行任務(wù)X。
[0057]相反的,對于任務(wù)X,如果workerl的取鎖目標(biāo)地址在被修改成遷移裝置的地址之后執(zhí)行了任務(wù)X,那么,任務(wù)X對應(yīng)的鍵值就同時存在于第一鎖和第二鎖中,假設(shè)workerf又獲取到了任務(wù)X,通過遷移裝置向第一鎖和第二鎖發(fā)送添加任務(wù)X對應(yīng)的鍵值的請求,則由于第二鎖中已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此向遷移裝置返回的結(jié)果是存在結(jié)果,遷移裝置則直接將該存在結(jié)果返回給worker2,worker2不執(zhí)行任務(wù)X。類似的,后續(xù)worker3獲取到該任務(wù)X后也同樣不會執(zhí)行任務(wù)X。
[0058]可見,在情況三中,任務(wù)X也未被重復(fù)執(zhí)行。
[0059]情況四、在執(zhí)行步驟S202、S203、S204的過程中,也即,遷移裝置在將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址時,由于也不可能同時修改所有執(zhí)行器的取鎖目標(biāo)地址,因此會出現(xiàn)一部分執(zhí)行器的取鎖目標(biāo)地址已經(jīng)被修改為第二鎖的地址,另一部分執(zhí)行器的取鎖目標(biāo)地址尚未修改(仍是遷移裝置的地址)的情況。
[0060]以圖3為例進(jìn)行說明,假設(shè)workerl的取鎖目標(biāo)地址已經(jīng)被修改為第二鎖的地址,worker2、worker3的取鎖目標(biāo)地址仍是遷移裝置的地址。
[0061]此時,對于一個任務(wù)X,如果workerl先獲取到這個任務(wù),則會直接向第二鎖發(fā)送添加該任務(wù)X對應(yīng)的鍵值的請求。假設(shè)任務(wù)X未被執(zhí)行過,則第一鎖和第二鎖中都未保存該任務(wù)X對應(yīng)的鍵值,因此,第二鎖會添加該任務(wù)X對應(yīng)的鍵值,向workerl返回的結(jié)果不是存在結(jié)果,從而workerl執(zhí)行該任務(wù)X。后續(xù)如果worker2獲取到該任務(wù)X,通過遷移裝置向第一鎖和第二鎖發(fā)送添加該任務(wù)X對應(yīng)的鍵值的請求,則由于此時第一鎖中未保存任務(wù)X對應(yīng)的鍵值,因此第一鎖添加該任務(wù)X對應(yīng)的鍵值,向遷移裝置返回的結(jié)果不是存在結(jié)果,但此時第二鎖中已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此向遷移裝置返回的結(jié)果是存在結(jié)果,從而,遷移裝置直接將第二鎖返回的該存在結(jié)果返回給worker2, worker2不執(zhí)行該任務(wù)X。
[0062]相反的,如果worker2先獲取到任務(wù)x,則由于worker2的取鎖目標(biāo)地址仍是遷移裝置的地址,worker2就會通過遷移裝置向第一鎖和第二鎖發(fā)送添加任務(wù)x對應(yīng)的鍵值的請求。假設(shè)任務(wù)X未被執(zhí)行過,則第一鎖和第二鎖中都未保存任務(wù)X對應(yīng)的鍵值,因此第一鎖和第二鎖都會添加任務(wù)X對應(yīng)的鍵值,向遷移裝置返回的結(jié)果也不是存在結(jié)果。遷移裝置由于接收到的第二鎖返回的結(jié)果不是存在結(jié)果,因此將第一鎖返回的結(jié)果返回給worker2,由于第一鎖返回的結(jié)果也不是存在結(jié)果,因此worker2執(zhí)行該任務(wù)X。后續(xù)如果workerl又獲取到任務(wù)x,則會直接向第二鎖發(fā)送添加該任務(wù)x對應(yīng)的鍵值的請求,而由于此時第二鎖中已經(jīng)保存了任務(wù)X對應(yīng)的鍵值,因此會響workerl返回存在結(jié)果,從而workerl不執(zhí)行任務(wù)X。
[0063]可見,在情況二中,任務(wù)X也未被重復(fù)執(zhí)行。
[0064]情況五、在步驟S204之后,也即,遷移裝置已經(jīng)將所有執(zhí)行器的取鎖目標(biāo)地址均修改為第二鎖的地址之后,各執(zhí)行器均從第二鎖中取鎖,而由于第二鎖的添加操作是互斥的,因此此時對于一個任務(wù)來說,只有一個執(zhí)行器會執(zhí)行該任務(wù),也就是說該任務(wù)只會被執(zhí)行一次。
[0065]由上述分析可見,通過如圖2所示的鎖遷移方法,如果遷移裝置并不能同時修改所有執(zhí)行器的取鎖目標(biāo)地址,那么圖2所示的遷移過程中會依次出現(xiàn)上述情況一?五,情況一?五均可避免執(zhí)行器重復(fù)執(zhí)行相同的任務(wù),如果理想情況下遷移裝置可以同時修改所有執(zhí)行器的取鎖目標(biāo)地址,那么圖2所示的遷移過程中會依次出現(xiàn)上述情況一、情況三、情況五,也均可避免執(zhí)行器重復(fù)執(zhí)行相同的任務(wù)。
[0066]進(jìn)一步的,在實際應(yīng)用中,考慮到采用如圖2所示的鎖遷移方法時,會出現(xiàn)一種特殊的情況,這種特殊的情況是:第一個執(zhí)行器在其取鎖目標(biāo)地址尚未被修改成遷移裝置的地址之前就執(zhí)行了一個任務(wù),而第二個執(zhí)行器的取鎖目標(biāo)地址被修改為遷移裝置的地址之后,很快就又被修改成第二鎖的地址,然后獲取到了同樣的任務(wù),這樣就會導(dǎo)致這個任務(wù)會被重復(fù)執(zhí)行,仍以圖3為例進(jìn)行說明。
[0067]假設(shè)對于任務(wù)X,worker2在取鎖目標(biāo)地址尚未被修改成遷移裝置的地址之前就執(zhí)行了任務(wù)X,也即,此時第一鎖中保存了任務(wù)X對應(yīng)的鍵值,而第二鎖中未保存任務(wù)X對應(yīng)的鍵值,如果此時workerl的取鎖目標(biāo)地址已經(jīng)經(jīng)歷了被修改成遷移裝置的地址再被修改成第二鎖的地址的過程,那么如果workerl又獲取到了任務(wù)X,則會直接從第二鎖中取鎖,由于第二鎖中此時并未保存任務(wù)X對應(yīng)的鍵值,因此workerl會再次執(zhí)行任務(wù)X。
[0068]上述特殊情況下任務(wù)被重復(fù)執(zhí)行的原因就在于:在遷移裝置將執(zhí)行器的取鎖目標(biāo)地址由遷移裝置的地址修改為第二鎖的地址的過程中,對于執(zhí)行器獲取到的一個任務(wù)而言,該任務(wù)對應(yīng)的鍵值只存在與第一鎖中,而不存在于第二鎖中。換言之,要避免上述特殊情況的出現(xiàn),只要在遷移裝置將執(zhí)行器的取鎖目標(biāo)地址由遷移裝置的地址修改為第二鎖的地址之前,使執(zhí)行器獲取到的任務(wù)對應(yīng)的鍵值既存在于第一鎖中也存在于第二鎖中,就可避免上述特殊情況下任務(wù)被重復(fù)執(zhí)行。
[0069]因此,在本發(fā)明實施例中,遷移裝置在將各執(zhí)行器的取鎖目標(biāo)地址修改為遷移裝置自身的地址之后,暫不將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址,而在將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址之前,向各任務(wù)隊列中添加預(yù)設(shè)的監(jiān)控任務(wù),并等待至接收到η次各執(zhí)行器發(fā)送的添加該監(jiān)控任務(wù)對應(yīng)的鍵值的請求時,再將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址。其中,η為任務(wù)隊列的數(shù)量。
[0070]采用上述方法可避免出現(xiàn)上述特殊情況的原因在于:任務(wù)隊列是采用“先入先出”機(jī)制的,即,對于一個任務(wù)隊列而言,先添加到該任務(wù)隊列中的任務(wù)會先被相應(yīng)的執(zhí)行器獲取到,后添加到該任務(wù)隊列中的任務(wù)則后被相應(yīng)的執(zhí)行器獲取到。那么,如果對于添加的監(jiān)控任務(wù)來說,遷移裝置接收到添加該監(jiān)控任務(wù)對應(yīng)的鍵值的請求的次數(shù)等于任務(wù)隊列的數(shù)量,就說明在各任務(wù)隊列中排在監(jiān)控任務(wù)之后的其他任務(wù)在被執(zhí)行器獲取到之后,都會通過遷移裝置向第一鎖和第二鎖添加鍵值,也就是說,在各任務(wù)隊列中排在監(jiān)控任務(wù)之后的其他任務(wù)的鍵值如果被第一鎖保存,其也會被第二鎖保存,此時,遷移裝置再將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址,就可以避免出現(xiàn)上述特殊情況而導(dǎo)致任務(wù)被重復(fù)執(zhí)行。
[0071]以上為本發(fā)明實施例提供的鎖遷移方法,基于同樣的發(fā)明思路,本發(fā)明實施例還提供一種鎖遷移裝置,如圖4所示。[0072]圖4為本發(fā)明實施例提供的鎖遷移裝置結(jié)構(gòu)示意圖,具體包括:
[0073]第一修改模塊401,用于在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述鎖遷移裝置自身的地址;
[0074]接收轉(zhuǎn)發(fā)模塊402,用于針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的所述請求發(fā)送給所述第一鎖和第二鎖,并接收所述第一鎖和第二鎖返回的結(jié)果;以及當(dāng)所述第二鎖返回的是存在結(jié)果時,向該執(zhí)行器返回所述存在結(jié)果,當(dāng)所述第二鎖返回的不是存在結(jié)果時,向該執(zhí)行器返回接收到的所述第一鎖返回的結(jié)果;
[0075]第二修改模塊403,用于將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址。
[0076]所述裝置還包括:
[0077]任務(wù)添加模塊404,用于在所述第二修改模塊403將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之前,向各任務(wù)隊列中添加預(yù)設(shè)的監(jiān)控任務(wù);
[0078]所述接收轉(zhuǎn)發(fā)模塊402還用于,接收各執(zhí)行器發(fā)送的添加所述監(jiān)控任務(wù)對應(yīng)的鍵值的請求;
[0079]所述第二修改模塊403具體用于,等待至所述接收轉(zhuǎn)發(fā)模塊402接收到η次添加所述監(jiān)控任務(wù)對應(yīng)的鍵值的請求時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址,其中,η為任務(wù)隊列的數(shù)量。
[0080]所述第一修改模塊401具體用于,將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述鎖遷移裝置自身的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述鎖遷移裝置自身的端口號。
[0081 ] 所述第二修改模塊403具體用于,將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述第二鎖的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述第二鎖的端口號。
[0082]所述裝置還包括:
[0083]重啟模塊405,用于在所述第二修改模塊403將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之后,重啟各執(zhí)行器。
[0084]本發(fā)明實施例提供一種鎖遷移方法及裝置,遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為該遷移裝置自身的地址,并接收執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的請求發(fā)送給第一鎖和第二鎖,當(dāng)接收到的第二鎖返回的結(jié)果是存在結(jié)果時,向執(zhí)行器返回該存在結(jié)果,當(dāng)接收到的第二鎖返回的結(jié)果不是存在結(jié)果時,將接收到的第一鎖返回的結(jié)果返回給執(zhí)行器,遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為第二鎖的地址。通過上述方法,可避免各執(zhí)行器從第一鎖遷移到第二鎖的過程中重復(fù)執(zhí)行相同的任務(wù)。
[0085]本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)、或計算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實施的計算機(jī)程序產(chǎn)品的形式。
[0086]在一個典型的配置中,計算設(shè)備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
[0087]內(nèi)存可能包括計算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機(jī)可讀介質(zhì)的示例。
[0088]計算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、動態(tài)隨機(jī)存取存儲器(DRAM)、其他類型的隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
[0089]本申請是參照根據(jù)本申請實施例的方法、設(shè)備(系統(tǒng))、和計算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機(jī)程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機(jī)程序指令到通用計算機(jī)、專用計算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機(jī)器,使得通過計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
[0090]這些計算機(jī)程序指令也可存儲在能引導(dǎo)計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機(jī)可讀存儲器中,使得存儲在該計算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
[0091]這些計算機(jī)程序指令也可裝載到計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機(jī)實現(xiàn)的處理,從而在計算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
[0092]盡管已描述了本申請的優(yōu)選實施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本申請范圍的所有變更和修改。
[0093]顯然,本領(lǐng)域的技術(shù)人員可以對本申請實施例進(jìn)行各種改動和變型而不脫離本申請實施例的精神和范圍。這樣,倘若本申請實施例的這些修改和變型屬于本申請權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請也意圖包含這些改動和變型在內(nèi)。
【權(quán)利要求】
1.一種鎖遷移方法,其特征在于,包括: 遷移裝置在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述遷移裝置自身的地址;并 針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的所述請求發(fā)送給所述第一鎖和第二鎖,并接收所述第一鎖和第二鎖返回的結(jié)果;以及 當(dāng)所述第二鎖返回的是存在結(jié)果時,所述遷移裝置向該執(zhí)行器返回所述存在結(jié)果,當(dāng)所述第二鎖返回的不是存在結(jié)果時,所述遷移裝置向該執(zhí)行器返回接收到的所述第一鎖返回的結(jié)果; 所述遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址。
2.如權(quán)利要求1所述的方法,其特征在于,所述遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之前,所述方法還包括: 所述遷移裝置向各任務(wù)隊列中添加預(yù)設(shè)的監(jiān)控任務(wù);并 等待至接收到η次各執(zhí)行器發(fā)送的添加所述監(jiān)控任務(wù)對應(yīng)的鍵值的請求,其中,η為任務(wù)隊列的數(shù)量。
3.如權(quán)利要求1所述的方法,其特征在于,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述遷移裝置自身的地址,具體包括: 所述遷移裝置將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述遷移裝置自身的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述遷移裝置自身的端口號。
4.如權(quán)利要求1所述的方法,其特征在于,所述遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址,具體包括: 所述遷移裝置將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述第二鎖的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述第二鎖的端口號。
5.如權(quán)利要求1所述的方法,其特征在于,所述遷移裝置將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之后,所述方法還包括: 重啟各執(zhí)行器。
6.一種鎖遷移裝置,其特征在于,包括: 第一修改模塊,用于在將各執(zhí)行器從第一鎖遷移到第二鎖上時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述鎖遷移裝置自身的地址; 接收轉(zhuǎn)發(fā)模塊,用于針對每個執(zhí)行器,接收該執(zhí)行器發(fā)送的添加鍵值的請求,將接收到的所述請求發(fā)送給所述第一鎖和第二鎖,并接收所述第一鎖和第二鎖返回的結(jié)果;以及當(dāng)所述第二鎖返回的是存在結(jié)果時,向該執(zhí)行器返回所述存在結(jié)果,當(dāng)所述第二鎖返回的不是存在結(jié)果時,向該執(zhí)行器返回接收到的所述第一鎖返回的結(jié)果; 第二修改模塊,用于將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址。
7.如權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 任務(wù)添加模塊,用于在所述第二修改模塊將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之前,向各任務(wù)隊列中添加預(yù)設(shè)的監(jiān)控任務(wù); 所述接收轉(zhuǎn)發(fā)模塊還用于,接收各執(zhí)行器發(fā)送的添加所述監(jiān)控任務(wù)對應(yīng)的鍵值的請求; 所述第二修改模塊具體用于,等待至所述接收轉(zhuǎn)發(fā)模塊接收到η次添加所述監(jiān)控任務(wù)對應(yīng)的鍵值的請求時,將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址,其中,η為任務(wù)隊列的數(shù)量。
8.如權(quán)利要求6所述的裝置,其特征在于,所述第一修改模塊具體用于,將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述鎖遷移裝置自身的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述鎖遷移裝置自身的端口號。
9.如權(quán)利要求6所述的裝置,其特征在于,所述第二修改模塊具體用于,將各執(zhí)行器配置文件中的互聯(lián)網(wǎng)協(xié)議IP地址修改為所述第二鎖的IP地址,將各執(zhí)行器配置文件中的端口號修改為所述第二鎖的端口號。
10.如權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括: 重啟模塊,用于在所述第二修改模塊將各執(zhí)行器的取鎖目標(biāo)地址修改為所述第二鎖的地址之后,重啟各執(zhí)行器。`
【文檔編號】G06F9/48GK103488530SQ201310425019
【公開日】2014年1月1日 申請日期:2013年9月17日 優(yōu)先權(quán)日:2013年9月17日
【發(fā)明者】汪海 申請人:新浪網(wǎng)技術(shù)(中國)有限公司