服務(wù)編排里有個核心的服務(wù),就是狀態(tài)機(jī)(State Machine)服務(wù),也稱為決策(Decider)服務(wù),用Netflix Conductor服務(wù)編排的架構(gòu)作為參考,我們可以看看狀態(tài)機(jī)所在的位置,下圖用紅框框著的就是狀態(tài)機(jī)服務(wù)。
狀態(tài)機(jī)一般分為有限狀態(tài)機(jī)FSM(Finite State Machine)、分層有限狀態(tài)機(jī)HFSM(Hierarchical Finite State Machine),包含狀態(tài)(State)、事件(Event)、轉(zhuǎn)換(Transition)、動作(Action)幾個關(guān)鍵元素,它們之間相互關(guān)聯(lián)和協(xié)同,在游戲或AI領(lǐng)域用得比較普遍。
玩過游戲的人肯定不陌生,特別是RPG,當(dāng)你用鼠標(biāo)或鍵盤上下左右指揮游戲角色行走或奔跑時就是一種狀態(tài),當(dāng)遇到敵人時就進(jìn)入了戰(zhàn)斗模式,這又是另種狀態(tài),而從一種狀態(tài)進(jìn)入另一種狀態(tài)是需要事件觸發(fā)的,也就是事件驅(qū)動,當(dāng)你中途退出后又重新進(jìn)入游戲,這時需要補(bǔ)償機(jī)制,也就是把之前游戲中的場景恢復(fù)回來。
FSM需要記住各種狀態(tài),通過事件的觸發(fā)(有條件),完成狀態(tài)之間的轉(zhuǎn)換。
當(dāng)狀態(tài)太多的時候,F(xiàn)SM會變得不容易維護(hù),這時候就需要進(jìn)行歸類,抽離相同或相似的狀態(tài)組成同類型的狀態(tài)機(jī),再用一個大的狀態(tài)機(jī)來維護(hù)這些不同類型的狀態(tài)機(jī),這樣就有了HFSM,同類型狀態(tài)機(jī)只關(guān)心內(nèi)部的狀態(tài)轉(zhuǎn)換,并不需要關(guān)心外部狀態(tài)的跳轉(zhuǎn),這樣就做到了無關(guān)狀態(tài)的隔離,而外部的狀態(tài)機(jī)只需要關(guān)注幾個同類型狀態(tài)機(jī)的跳轉(zhuǎn),如果狀態(tài)還比較多,可以再次提取進(jìn)行多層歸類,這樣一來大大降低了狀態(tài)機(jī)的復(fù)雜度。
簡單的說在服務(wù)編排中就是做更新和調(diào)度的事情,更新工作流狀態(tài),確定下一個狀態(tài),結(jié)合分布式隊列服務(wù)調(diào)度合適的任務(wù),當(dāng)然也可以處理失敗、錯誤、異常補(bǔ)償機(jī)制??梢姞顟B(tài)機(jī)服務(wù)在服務(wù)編排中的重要作用,其實(shí)就是一個中樞內(nèi)核。
如果只是體驗,覺得Netflix Conductor還太復(fù)雜,網(wǎng)上也有多種實(shí)現(xiàn)思路,用Camel結(jié)合activeMQ也是不錯的簡單組合,當(dāng)然也要求你的動手能力夠強(qiáng),類似于品牌機(jī)和組裝機(jī)的選擇。