storm 的状态转换函数

最近研究storm的源码,走到状态转换的时候感觉有点特别,记录一下:

storm的topology状态包括: active、inactive、killed、rebalancing四个状态

状态转换主要发生在对作业的状态进行更改操作上,如:当kill一个作业的时候,就会是作业由active转到killed

(defn state-transitions [nimbus storm-id status] {:active {:inactivate :inactive :activate nil :rebalance (rebalance-transition nimbus storm-id status) :kill (kill-transition nimbus storm-id) } :inactive {:activate :active :inactivate nil :rebalance (rebalance-transition nimbus storm-id status) :kill (kill-transition nimbus storm-id) } :killed {:startup (fn [] (delay-event nimbus storm-id (:kill-time-secs status) :remove) nil) :kill (kill-transition nimbus storm-id) :remove (fn [] (log-message "Killing topology: " storm-id) (.remove-storm! (:storm-cluster-state nimbus) storm-id) nil) } :rebalancing {:startup (fn [] (delay-event nimbus storm-id (:delay-secs status) :do-rebalance) nil) :kill (kill-transition nimbus storm-id) :do-rebalance (fn [] (do-rebalance nimbus storm-id status) (:old-status status)) }})

刚开始我以为作业的状态转换就是直接在这个函数中进行的,导致想不明白他是怎么运行的。其实,这个函数只是负责返回针对传进来的storm-id和status返回一个状态转换的map。而每一个map的value是一个操作函数,后面的操作会获取相应的操作函数进行状态转换:

transition (-> (state-transitions nimbus storm-id status)
                                (get (:type status))
                                (get-event event))

具体的细节,可以研究一下代码。这里主要让我迷惑的是这个状态转换函数只是一个映射结构,不知道如果调用具体操作函数了,还是以过程式思想来考虑问题了。

      

你可能感兴趣的:(storm 的状态转换函数)