大資料之ZStack——引擎,看了之後秒懂啊!

大資料之ZStack——引擎,看了之後秒懂啊!

資料中心由多種資源組成,包括物理(如儲存、伺服器)和虛擬(如虛擬機器)。IaaS軟體本質上是管理各種資源的狀態;例如,建立虛擬機器通常會改變儲存的狀態(在商店上建立新的磁碟)、網路的狀態(在網路上設定DHCP/DNS/NAT等)和虛擬狀態。機器管理程式(在虛擬機器管理程式上建立)一個新的虛擬機器。與普通應用程式不同,大多數應用程式管理儲存在記憶體或資料庫中的狀態。為了反映資料中心的整體狀態,IAAS軟體必須管理分散在每個裝置中的狀態,從而導致長的執行路徑。IaaS軟體任務通常涉及多個裝置上的狀態改變,在任何步驟都可能發生錯誤,然後系統處於中間狀態,也就是說,一些裝置已經改變了狀態,有些則沒有。例如,當建立虛擬機器時,用於配置IaaS軟體的VM網路的常規步驟是DHCP DNS SNAT。如果在建立SNAT時發生錯誤,則先前配置的DHCP和DNS很可能保留在系統中,因為即使在最後沒有成功建立虛擬機器,它們也已經成功應用。這種不一致的狀態通常會導致雲層不穩定。

另一方面,在傳統的IaaS軟體中,硬編碼的業務邏輯是不靈活的,為了改變,開發人員經常不得不重寫或修改現有程式碼來改變某些已建立的行為,從而影響軟體的穩定性。

解決這些問題的方法是引入工作流的概念,將整個業務邏輯分解成細粒度的回滾步驟,以便軟體能夠清理生成的錯誤的狀態並使軟體可配置。

注意:在ZStad中,我們可以呼叫工作流“流程”中的步驟,在下面的文章中,流程(流程)和步驟(步驟)是可互換的。

問題

錯誤處理一直是軟體設計中的頭疼問題。即使現在每個軟體工程師都知道錯誤處理的重要性,但事實上,他們仍然在找藉口來忽略它。巧妙的錯誤處理是困難的,特別是在任務可以跨多個元件的系統中。即使有經驗的工程師能夠注意自己程式碼中的錯誤,他們也不能為他們不寫的元件做出類似的努力,如果整個體系結構不是強制性的,那麼它可以以全域性的方式增強錯誤處理的機制。忽略錯誤處理在IaaS軟體中尤其有害。不同於透過重新啟動恢復所有狀態的消費程式,IaaS軟體通常不能恢復其自身狀態,並且將要求管理員手動在資料庫和外部裝置中出錯。一個不一致的狀態可能不會導致任何大的問題,甚至可能不會被注意到,但是這種不一致狀態的持續積累最終會在某個時刻破壞整個雲系統。

在這裡相信有許多想要學習大資料的同學,大家可以關注小編頭條號和轉發,關注私信【學習】即可免費領取一整套系統的大資料學習教程!

工作流引擎

工作流是一種將一些繁瑣的方法呼叫分解成細粒度的步驟,它集中在一件事情上。它由一個序列或狀態機驅動來完成一個完整的任務。在配置回滾處理程式之後,工作流在某個步驟發生錯誤或未處理異常時,可以中止執行並回滾所有先前的執行步驟。以建立虛擬機器為例,主工作流看起來像:

大資料之ZStack——引擎,看了之後秒懂啊!

序列工作流是由鏈式設計模式(鏈式模式)生成的,具有可預測的執行序列,是ZStad工作流的基礎。一個流本質上是一個可以包含子過程和後才可以完成以前所有的流程執行java介面。

公共介面流{

空隙執行(FlowTrigger trigger,地圖資料);

空隙回滾(FlowTrigger trigger,地圖資料);

}

在流程介面中,當工作流前進到這個過程(流程)時,將呼叫Run(FlowTrigger trigger,MAP資料)方法;引數對映資料可以用來從先前的程序(流)獲得資料,並將資料傳遞給後續的程序(流)。當它完成時,程序(流程)呼叫ToGr。NeXT(引導)工作流(工作流)來執行下一個程序(流程);如果發生錯誤,程序(流)應該呼叫TrutGel。Valt(ErrOrror Error)方法來中止執行,並通知工作流(工作流)回滾完成。D流。程序(包括失敗的程序本身)呼叫它們各自的回滾()方法。

在FlowChain介面中建立的過程代表一個完整的工作流。建立FlowChain有兩種方法:

1。陳述式

該過程可以在元件的Spring配置檔案中配置,並且可以透過向FlowChainBuilder填充程序的類名稱的列表來建立流程鏈。

大資料之ZStack——引擎,看了之後秒懂啊!

這是建立包含可重用程序的嚴重可配置工作流的典型方法。在上面的示例中,該工作流的目的是建立使用者VM;所謂的應用VM具有與分散式虛擬機器網絡卡外部基本相同的相同程序,因此裝置VM和使用者VM程序配置A的單個程序配置。最共享:

大資料之ZStack——引擎,看了之後秒懂啊!

注意:在上一張圖片中,我們強調了Apple ServestMultLogATeNICFLUE流程為Green,這是建立使用者VM和VM應用的工作流步驟的唯一不同地方。

2。程式設計方法

流程鏈也可以以程式設計方式建立。當建立工作流是微不足道的,並且該過程是不可重用的時,通常使用此方法。

FuffChin鏈= FuffChin Buffeld。 NeimSimple流鏈();

連結串列名稱(“測試”);

SeDATA(NeWHASMAP);

Chain。then(NeWFLASH){()

StrugIn NaMeEng= =“FLUT1”;

@重寫

Publicvoidrun(FlowTriggertrigger,MaDATA){

*做一些生意*/

Trigger。next();

}

@重寫

公共VoIP回滾(FlowTriggertrigger,MaDATA){

/*回滾某物*

Trigger。rollback();

}

“}”然後(NeWFLASH(){)

StrugIn NaMeEng= =“Fuff2”;

@重寫

Publicvoidrun(FlowTriggertrigger,MaDATA){

*做一些生意*/

Trigger。next();

}

@重寫

公共VoIP回滾(FlowTriggertrigger,MaDATA){

/*回滾某物*

Trigger。rollback();

}

“完成”(NeXFraveNeDebug(){)

@重寫

Publicvoidhandle(MaDATA){

*工作流已成功完成*

}

“}”。Nebug(NeXFraveRoWorkter)({)

@重寫

Publicvoidhandle(ErrorCodeerrCode,MaDATA){

*工作流失敗,錯誤*//

}

}啟動();

上述形式不方便使用,因為在流中,可以使用地圖資料來交換資料,並且每個程序必須冗餘地呼叫DATA GET()和DATA PUT()函式。在類似DSL的方式中,流可以透過變數共享資料:

FuffChin鏈= FuffChin Buffeld。NexSealFuffon鏈();

連結串列名稱(“測試”);

Chain。then(NexSyfSt流()){()

StReDATA1=“資料可以被定義為類變數”;

{

DATA1=“資料可以在物件初始化器中進行初始化”;

}

@重寫

Publicvoidsetup(){

FialStReDATA2= =“資料也可以在方法範圍內定義,但它卻”;

流(NeXFLUE){()

StrugIn NaMeEng= =“FLUT1”;

@重寫

Publicvoidrun(FlowTriggertrigger,MaDATA){

DATA1=“我們可以在這裡改變資料”;

STRIGUSEDATA2=DATA2;

*做某事*

Trigger。next();

}

@重寫

公共VoIP回滾(FlowTriggertrigger,MaDATA){

*做一些回滾*

Trigger。rollback();

}

(});

流(NealNoRealFraceFuffy)({)

StrugIn NaMeEng= =“Fuff2”;

@重寫

Publicvoidrun(FlowTriggertrigger,MaDATA){

** DATA1是我們在流1**中改變的值。

STRIGUSEDATA1=DATA1;

*做某事*

Trigger。next();

}

(});

完成(NeXFruteNoDeLever)({)

@重寫

Publicvoidhandle(MaDATA){

*工作流已成功完成*

}

(});

錯誤(NeXFraveRoWorkter)({)

@重寫

Publicvoidhandle(ErrorCodeerrCode,MaDATA){

*工作流失敗,錯誤*//

}

(});

}

}啟動();

另外,大資料初學者有什麼不懂的可以關注私信【學習】和轉發——我剛整理了一份大資料2018最新的0基礎入門和進階教程,無私分享

大資料之ZStack——引擎,看了之後秒懂啊!