據(jù)庫中,當前中心結(jié)點在設定的等待時間內(nèi)等待所有副本結(jié)點同步消息;本實施例1假設存儲成功。
[0041]所有副本結(jié)點同步消息進程與當前中心結(jié)點存儲消息進程同步進行,包括以下步驟:
[0042]步驟211:各個副本結(jié)點周期性地向當前中心結(jié)點發(fā)起消息同步請求,同步請求里含有其當前已存儲的消息位置。
[0043]步驟212:中心結(jié)點接收到消息同步請求,讀取各個副本結(jié)點當前已存儲的消息位置,記錄所有副本結(jié)點共同到達的消息位置,即消息水位,將所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在消息水位及之前的消息狀態(tài)設置為“成功”,同時向各個副本結(jié)點發(fā)送其當前已存儲消息位置之后的消息及所記錄的消息水位。
[0044]步驟213:各個副本結(jié)點存儲消息,同時進行步驟211。
[0045]消息ID有與生產(chǎn)者約定的前綴或者后綴,如:正常消息1234,重試消息$_1234,那么約定以$_開頭的就是重試的消息(也包括重復的消息)。
[0046]當前中心結(jié)點存儲消息進程與所有副本結(jié)點同步消息進程同步進行后的步驟204:完成當前生產(chǎn)消息進程,具體有兩種結(jié)果:
[0047]結(jié)果1:在等待時間內(nèi),消息水位到達當前生產(chǎn)的消息位置,所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在當前生產(chǎn)的消息位置及之前的消息狀態(tài)設置為“成功”;
[0048]結(jié)果2:在等待時間內(nèi),消息水位未到達當前生產(chǎn)的消息位置,所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在消息水位及之前的消息狀態(tài)設置為“成功”,當前中心結(jié)點處在消息水位之后的消息狀態(tài)仍為“處理中”。
[0049]本實施例1完成當前生產(chǎn)消息進程結(jié)果如圖3的情形C、D均可能,本實施例1假設完成當前生產(chǎn)消息進程結(jié)果如圖3情形C所示,消息水位到達消息5。當前中心結(jié)點處在消息水位之后的消息狀態(tài)仍為“處理中”,即當前中心結(jié)點消息6的消息狀態(tài)為“處理中”,當前中心結(jié)點和副本結(jié)點I已存儲的消息6對消息消費者不可見。此情形對于圖1的A、B兩種情形均適用。
[0050]如圖4所示,為本發(fā)明實施例切換當前中心結(jié)點后所有結(jié)點消息存儲示意圖,亦作為本發(fā)明實施例2生產(chǎn)消息前當前中心結(jié)點與所有副本結(jié)點消息存儲示意圖。本實施例假設圖3情形C切換當前中心結(jié)點為副本節(jié)點1,切換后如圖4情形Cl所示,所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)清除處在消息水位之后的數(shù)據(jù),即清除數(shù)據(jù)6。圖4上方情形Cl具體示出所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)如何清除處在消息水位之后的數(shù)據(jù),即清除數(shù)據(jù)6 ;圖4下方情形Cl具體示出所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)清除數(shù)據(jù)6后的結(jié)果狀態(tài)。
[0051]如圖2所示,為本發(fā)明實施例生產(chǎn)消息的流程圖。本發(fā)明實施例2生產(chǎn)消息前當前中心結(jié)點與所有副本結(jié)點消息存儲示意圖如圖4所示,本實施例2假設生產(chǎn)者生產(chǎn)消息
6ο
[0052]當前中心結(jié)點存儲消息進程,包括以下步驟:
[0053]步驟201:當前中心結(jié)點接收消息生產(chǎn)者生產(chǎn)的消息,判斷其是否為重試消息,如為重試消息,進入步驟202,否則進入步驟203 ;本實施例2消息6為重試消息。
[0054]步驟202:當前中心結(jié)點在數(shù)據(jù)庫中查詢并獲取重試消息狀態(tài)及其處理結(jié)點,如其狀態(tài)為“成功”或其狀態(tài)為“處理中”且其處理結(jié)點為當前中心結(jié)點,則返回相應的響應給消息生產(chǎn)者,結(jié)束當前生產(chǎn)消息進程,如其狀態(tài)為“失敗”或其狀態(tài)為“處理中”且其處理結(jié)點非當前中心結(jié)點,則進入步驟203 ;本實施例2消息6為狀態(tài)為“處理中”且其處理結(jié)點非當前中心結(jié)點。
[0055]步驟203:當前中心結(jié)點存儲此消息,若存儲失敗,設置此消息狀態(tài)為“失敗”并將消息狀態(tài)及其處理結(jié)點保存到數(shù)據(jù)庫中,返回失敗響應給消息生產(chǎn)者,結(jié)束當前生產(chǎn)消息進程,如存儲成功,設置此消息狀態(tài)為“處理中”并將消息狀態(tài)及其處理結(jié)點保存到數(shù)據(jù)庫中,當前中心結(jié)點在設定的等待時間內(nèi)等待所有副本結(jié)點同步消息;本實施例2假設存儲成功。
[0056]所有副本結(jié)點同步消息進程與當前中心結(jié)點存儲消息進程同步進行,包括以下步驟:
[0057]步驟211:各個副本結(jié)點周期性地向當前中心結(jié)點發(fā)起消息同步請求,同步請求里含有其當前已存儲的消息位置;
[0058]步驟212:中心結(jié)點接收到消息同步請求,讀取各個副本結(jié)點當前已存儲的消息位置,記錄所有副本結(jié)點共同到達的消息位置,即消息水位,將所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在消息水位及之前的消息狀態(tài)設置為“成功”,同時向各個副本結(jié)點發(fā)送其當前已存儲消息位置之后的消息及所記錄的消息水位;
[0059]步驟213:各個副本結(jié)點存儲消息,同時進行步驟211 ;
[0060]當前中心結(jié)點存儲消息進程與所有副本結(jié)點同步消息進程同步進行后的步驟204:完成當前生產(chǎn)消息進程,具體有兩種結(jié)果:
[0061]結(jié)果1:在等待時間內(nèi),消息水位到達當前生產(chǎn)的消息位置,所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在當前生產(chǎn)的消息位置及之前的消息狀態(tài)設置為“成功”;
[0062]結(jié)果2:在等待時間內(nèi),消息水位未到達當前生產(chǎn)的消息位置,所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在消息水位及之前的消息狀態(tài)設置為“成功”,當前中心結(jié)點處在消息水位到當前生產(chǎn)的消息位置之間的消息狀態(tài)仍為“處理中”。
[0063]本實施例2完成當前生產(chǎn)消息進程結(jié)果如圖3的情形C、D均可能,本實施例2假設完成當前生產(chǎn)消息進程結(jié)果如圖3情形D所示,消息水位到達消息6。所有結(jié)點(包括當前中心結(jié)點和所有副本結(jié)點)處在消息水位及之前的消息狀態(tài)為“成功”,已“成功”生產(chǎn)的消息對消費者可見,即消息1-6對消息消費者均可見。
[0064]以上所述僅為本發(fā)明專利的實施例而已,并不用以限制本發(fā)明專利,凡在本發(fā)明專利的精神和原則之內(nèi)所做的任何修改、等同替換和改進等,均以包含在本發(fā)明專利的保護范圍之內(nèi)。
【主權(quán)項】
1.一種生產(chǎn)消息的方法,其特征在于包括當前中心結(jié)點存儲消息進程步驟和所有副本結(jié)點同步消息進程步驟; 當前中心結(jié)點存儲消息進程步驟: 步驟一、當前中心結(jié)點接收消息生產(chǎn)者生產(chǎn)的消息,判斷其是否為重試消息,如為重試消息,進入步驟二,否則進入步驟三; 步驟二、判斷消息狀態(tài)及其處理結(jié)點:當前中心結(jié)點在數(shù)據(jù)庫中查詢并獲取重試消息狀態(tài)及其處理結(jié)點,如其狀態(tài)為“成功”或其狀態(tài)為“處理中”且其處理結(jié)點為當前中心結(jié)點,則返回相應的響應給消息生產(chǎn)者,結(jié)束當前生產(chǎn)消息進程;如其狀態(tài)為“失敗”或其狀態(tài)為“處理中”且其處理結(jié)點非當前中心結(jié)點,則進入步驟三; 步驟三、當前中心結(jié)點開始存儲此消息,若存儲失敗,設置此消息狀態(tài)為“失敗”并將消息狀態(tài)及其處理結(jié)點保存到數(shù)據(jù)庫中,返回失敗響應給消息生產(chǎn)者,結(jié)束當前生產(chǎn)消息進程;如存儲成功,設置此消息狀態(tài)為“處理中”并將消息狀態(tài)及其處理結(jié)點保存到數(shù)據(jù)庫中,當前中心結(jié)點在設定的等待時間內(nèi)等待所有副本結(jié)點同步消息; 所有副本結(jié)點同步消息進程步驟與當前中心結(jié)點存儲消息進程同步進行,包括以下步驟: 步驟一:各個副本結(jié)點周期性地向當前中心結(jié)點發(fā)起消息同步請求,同步請求里含有其當前已存儲的消息位置; 步驟二:中心結(jié)點接收到消息同步請求,讀取各個副本結(jié)點當前已存儲的消息位置,記錄所有副本結(jié)點共同到達的消息位置,即消息水位,將所有結(jié)點、包括當前中心結(jié)點和所有副本結(jié)點、)處在消息水位及之前的消息狀態(tài)設置為“成功”,同時向各個副本結(jié)點發(fā)送其當前已存儲消息位置之后的消息及所記錄的消息水位; 步驟三:各個副本結(jié)點存儲消息。2.根據(jù)權(quán)利要求1所述生產(chǎn)消息的方法,其特征在于,當前中心結(jié)點存儲消息進程步驟一中判斷是否為重試消息和步驟二中判斷消息狀態(tài)及其處理結(jié)點,使得當網(wǎng)絡故障或中心結(jié)點切換等情況發(fā)生時,不會生產(chǎn)重復消息。3.根據(jù)權(quán)利要求1所述生產(chǎn)消息的方法,其特征在于,所有副本結(jié)點同步消息進程的步驟二中,當前中心結(jié)點向各個副本結(jié)點發(fā)送所記錄的消息水位,當前中心結(jié)點切換時,所有結(jié)點、包括當前中心結(jié)點和所有副本結(jié)點、)清除處在消息水位之后的數(shù)據(jù),使得不會生產(chǎn)重復消息。4.根據(jù)權(quán)利要求1所述生產(chǎn)消息的方法,其特征在于,當前中心結(jié)點存儲消息進程的步驟三中,當前中心結(jié)點存儲消息成功,設置此消息狀態(tài)為“處理中”和所有副本結(jié)點同步消息進程的步驟二中消息水位的記錄以及將所有結(jié)點、包括當前中心結(jié)點和所有副本結(jié)點處在消息水位及之前的消息狀態(tài)設置為“成功”,保證所有結(jié)點處在消息水位及之前的數(shù)據(jù)一致性,使得當網(wǎng)絡故障或中心結(jié)點切換等情況發(fā)生時,不會丟失消息。5.根據(jù)權(quán)利要求1所述生產(chǎn)消息的方法,其特征在于當前中心結(jié)點存儲消息進程與所有副本結(jié)點同步消息進程同步進行后完成當前生產(chǎn)消息進程,具體有兩種結(jié)果: 結(jié)果1:在等待時間內(nèi),消息水位到達當前生產(chǎn)的消息位置,所有結(jié)點、包括當前中心結(jié)點和所有副本結(jié)點、)處在當前生產(chǎn)的消息位置及之前的消息狀態(tài)設置為“成功”; 結(jié)果2:在等待時間內(nèi),消息水位未到達當前生產(chǎn)的消息位置,所有結(jié)點、包括當前中心結(jié)點和所有副本結(jié)點處在消息水位及之前的消息狀態(tài)設置為“成功”,當前中心結(jié)點處在消息水位之后的消息狀態(tài)仍為“處理中”。
【專利摘要】一種生產(chǎn)消息的方法,包括當前中心結(jié)點存儲消息進程步驟和所有副本結(jié)點同步消息進程步驟;當前中心結(jié)點存儲消息進程:步驟一、當前中心結(jié)點接收消息生產(chǎn)者生產(chǎn)的消息,判斷其是否為重試消息,是則進入步驟二,否則進入步驟三;步驟二、判斷消息狀態(tài)及其處理結(jié)點:當前中心結(jié)點在數(shù)據(jù)庫中查詢并獲取重試消息狀態(tài)及其處理結(jié)點,如其狀態(tài)為“成功”或其狀態(tài)為“處理中”且其處理結(jié)點為當前中心結(jié)點,則返回相應的響應給消息生產(chǎn)者;如其狀態(tài)為“失敗”或其狀態(tài)為“處理中”且其處理結(jié)點非當前中心結(jié)點,則進入步驟三;步驟三、當前中心結(jié)點開始存儲此消息;所有副本結(jié)點同步消息進程步驟與當前中心結(jié)點存儲消息進程同步進行。
【IPC分類】H04L29/08
【公開號】CN105141687
【申請?zhí)枴緾N201510512377
【發(fā)明人】王亞軍, 吳聞宇, 陳濤, 丁金龍, 周超
【申請人】焦點科技股份有限公司
【公開日】2015年12月9日
【申請日】2015年8月19日