有限狀態機學習

有限狀態機是什麼

有限狀態機(英語:finite-state machine,縮寫:FSM)又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態(State)以及在這些狀態之間的轉移(Transition)和動做(Action)等行爲的數學模型。git

狀態機有三個特徵:github

  1. 狀態(State)總數是有限的。
  2. 在任一時刻,只處於一種狀態。
  3. 在某種條件(Event)下,會從某種狀態轉移(Transition)到另外一種狀態,同時執行某個動做(Action)。

從有限狀態機的定義和特徵咱們能夠看到它的幾個重要概念:正則表達式

  • 狀態(State):包括初始狀態和事件觸發後的狀態,同時必需要有一個最終狀態。
  • 事件(Event):觸發狀態機從一種狀態切換到另外一種狀態。
  • 轉移(Transition):狀態切換路徑,包含Event(觸發該轉移的事件),Source(源狀態),Target(目的狀態)。
  • 動做(Action):表示在進行狀態轉移後要執行的具體行爲。

因爲有限狀態機的這些特徵,咱們能夠把狀態轉移的過程作成相似這樣的狀態轉移表。spring

條件\當前狀態 狀態A 狀態B 狀態C 狀態D
條件X 狀態B 狀態C 狀態D ...
條件Y 狀態C 狀態D ... ...
條件Z ... 狀態A 狀態A 狀態A

能夠概括爲一個公式。
Old State + Event = New State編程

把上面的狀態轉移表用公式表達就是
狀態A + 條件X = 狀態B
狀態A + 條件Y = 狀態C
...restful

有限狀態機例子

咱們小時候都應該玩過貪吃蛇這個遊戲,遊戲規則沒必要再說,咱們看看使用有限狀態機來實現這個遊戲。網絡

狀態轉移表:微服務

條件\當前狀態 GAME_OVER UP DOWN LEFT RIGHT
EAT ... UP DOWN LEFT RIGHT
HIT ... GAME_OVER GAME_OVER GAME_OVER GAME_OVER
TURN_UP UP ... ... UP UP
TURN_DOWN DOWN ... ... DOWN DOWN
TURN_LEFT LEFT LEFT LEFT ... ...
TURN_RIGHT RIGHT RIGHT RIGHT ... ...

EAT:吃掉食物
HIT:撞牆或本身
TURN_UP:向上轉向事件
...
GAME_OVER: 爲了簡便一點,咱們讓它既是開始又是結束的狀態,當按下上下左右任一鍵時開始遊戲。
UP: 向上前進狀態,此時能夠吃掉食物,也能夠撞到牆或本身,同時能夠向左向右轉向,但按下向上或向下是不會觸發任何動做。
...ui

當咱們把狀態轉移表定義好以後就會發現這個遊戲剩下的部分很是好寫,並且邏輯很是清楚,這就是有限狀態機的好處。編碼

有限狀態機在編程中有哪些應用

  • 詞法分析
  • 正則表達式
  • 網絡協議
  • 遊戲設計
  • 自動電話客服
  • ...

咱們用有限狀態機作什麼

筆者目前所在的部門是正在使用OpenStack作電子網絡靶場的一個項目,必然少不了對虛擬機各項指標的採集,所以對採集進行監控也是必要的措施,以便在採集故障以後及時預警。

整個監控流程是由客戶端(Java微服務)往Kafka中發一條採集配置,採集端(Python)收到這條配置後進行解析配置,而後進行指標採集,同時往Kafka回傳一些運行信息,當想要中止採集時須要客戶端再次下發一條關閉配置,採集端進行執行並回傳至Kafka關閉信息。

看似這個過程十分簡單,像把大象裝進冰箱同樣簡單。

  1. 打開冰箱門。
  2. 把大象塞進行。
  3. 關上冰箱門。

使用有限狀態機來作其中的狀態轉移時真的就像是把大象塞進冰箱同樣簡單(其中使用restful接口接收客戶端的開始關閉配置,監聽kafka指定topic來處理採集端消息)。

定義狀態轉移表

條件\當前狀態 Idle processing wait_close exception timeout closed
start_conf
error_conf closed
pro_start processing
heartbeat processing processing
error_runtime exception
stop_conf wait_close wait_close wait_close
pro_stop closed closed closed
msg_timeout timeout timeout timeout timeout
fix closed

事件

  • start_conf:客戶端(Java微服務)採集配置
  • error_conf:採集端(Python)配置解析錯誤
  • pro_start:採集端(Python)開始採集
  • heartbeat:採集端(Python)正在採集
  • error_runtime :採集端(Python)採集過程當中出錯
  • stop_conf:客戶端(Java微服務)關閉配置
  • pro_stop: 採集端(Python)退出採集
  • msg_timeout:採集端(Python)消息超時
  • fix: 監控端 手動確認任務已經人爲修復

狀態

  1. Idle:收到採集配置後有限狀態機的默認狀態
  2. processing:正在採集
  3. wait_close :收到關閉配置後等待關閉
  4. exception:採集異常
  5. timeout:超時
  6. closed:採集關閉

使用狀態機進行編碼

筆者這裏使用的庫是squirrel-foundation,支持多實例狀態機而且和spring進行整合也比較簡單。

總結

有限狀態機能使咱們從複雜的狀態轉移判斷中脫離出來,專心業務邏輯,而且避免狀態轉移過程的判斷錯誤,是一種很強大的模型。

相關文章
相關標籤/搜索