java 状态机_Yarn的状态机机制
好久不見,最近事情好多,越不寫越不敢寫,感覺等了這么久,要不要寫得更好一些才能對得起自已。所以看的都是更深的問題,今天我嘗試聊一下yarn的狀態機設計,這塊我不是第一天看了,之前也看了幾天,雖然不是一直看,但是只要有時間都要看一點。這塊還是很體現設計的。但是不好理解,更不好用語言來表達,所以我試著聊聊,不一定能說清楚。
下面我們就開始聊,首先咱們先說一下狀態機是干啥的,這么個上古概念為什么hadoop這么流行的系統還在使用?先來回答第一個問題其實這個東西是很實用,也很基礎的。在系統級開發中的作用很大,之前寫c++的時候經常用到,只是java這塊大家習慣了spring的產品化。
不多說了,我們看看狀態機的實現吧,首先我們看一下StateMachine接口,這是個范性接口,里面定義了三個概念,如下所示:
STATE,狀態
EVENTTYPE,事件類型
EVENT,事件
狀態機就是狀態的變化管理,所以STATE代理的就是這個狀態,而EVENTTYPE代表的事件類型,也就是觸發一個事件的條件,事件則是真正的處理邏輯。了解了這三個重要概念我們再看一下這個接口的重要方法:
STATE getCurrentState();
STATE doTransition(EVENTTYPE eventType, EVENT event);
getCurrentState這個大家一看就清楚是獲取當前的狀態,而doTransition則是最核心的狀態變化,需要關注二點,第一是參數,這里的兩個參數的做用就是接收到特定的事件類型,然后觸發對應的事件。第二是返回值STATE,大家注意到了吧也就是執行完這個方法后會從之前的狀態轉變到另一個狀態,以此來實現狀態的轉變。
了解了StateMachine接口,就知道了狀態機要做什么。那么我們再看一個具體的實現類來了解hadoop中是如何實現StateMachine接口的。InternalStateMachine是在hadoop中的一個具體實現類,我們首先看一下他的成員都有哪些:
OPERAND operand;
STATE currentState;
StateTransitionListener listener;
Operand是操作對象,也就是狀態機將控制的具體對象。currentState就是當前狀態,listener這個是監聽器,也就是在特定是時機通知相關對象的機制,這里可以先忽略。
接下來看一下核心方法doTransition方法,這里面最關鍵的就是下面這句。
currentState = StateMachineFactory.this.doTransition(
operand,
currentState,
eventType,
event);
首先他調用了StateMachineFactory中的doTransition方法去實際處理這個狀態轉化。這個方法返回的結果就是新的狀態。
這里要解釋一下StateMachineFactory.this的用法,這個在工場類中很常見。實現的目的就是可以在內部類中訪問創建內部類的真實父類的方法,為什么這么繞著說呢,是因為類有可能多重派生。比如a繼承b,b繼承c。然后d是c中的內部類,當我用a去創建d的時候。this指代的是a而不是b。哎,能聽懂的聽懂,不能懂的也不影響,我們接著說狀態機。
那么我們就要看一下StateMachineFactory類了。先來看一下他的主要成員:
TransitionsListNode transitionsListNode;
Map>> stateMachineTable;
其實這兩個是一回事,transitionsListNode是一個單鏈表是用于生成stateMachineTable的。而stateMachineTable是一個二層的Map。第一層是狀態與Map的映射。第二層是事件類型與Transition的的映射。通俗一點的解釋,就是一個狀態對就多個事件類型,不同的事件類型對應Transition類。這樣我們就清楚了狀態轉換的內核原理。下面我們再來看一下Transition接口。很直接只有一個方法:doTransition。拿SingleInternalArc實現類來舉例,我們看SingleInternalArc的成員有:
STATE postState;
SingleArcTransition hook;
postState就是這個轉化的目的狀態。而SingleArcTransition這個接口就是在這個轉化中真實處理的邏輯。所有狀態轉化實現類都要實現這個接口。
到這,狀態機的原理和關鍵代碼已經講完了。希望對喜歡代碼的朋友有點幫助。其實在我們的實際工作中很多時候都可以用這個設計模式來解決問題。比如汽車有啟動和停止兩種狀態。在停止狀態下踩油門是沒有用的,而在啟動狀態下足彩油門則可以加速。當然這樣的例子很多。大家可以多思考,通過使用狀態機可以使我們的代碼更生動更易于理解。而且配合uml的狀態圖則會使這種設計更加直觀。
總結
以上是生活随笔為你收集整理的java 状态机_Yarn的状态机机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何区分文件类型_pytho
- 下一篇: 运维开发学go还是python_运维工程