你有試過重開嗎?
除了一般的錯誤處理,BEAM 提供了我們另一個藉由關閉 process 在重啟的監督安全網
預設時,當一個 worker process 發生錯誤,他直屬的 supervisor 會依照上一篇提到的重啟設定重新啟動,但如果這個 worker 就算重啟之後還是錯誤又關閉,在一定次數後,直屬的 supervisor 會關閉他自己,關閉的 supervisor 的上層發現下面的 supervisor 自己關閉了又會依照設定重新開啟 supervisor,接著又會重新開啟 worker。最慘情形就是有無法回復的嚴重錯誤導致整個監督鏈關閉。
在開啟 Supervisor 時除了之前介紹的 stragegy 之外還有幾個可選的設定
Supervisor.start_link(
Bank,
strategy: :one_for_one,
max_restarts: 3,
max_second: 5,
auto_shotdown: :never,
name: NameOfThisSupervisor
)
max_second
與 max_restarts
決定了什麼時候要關閉自己。在 max_second
裡如果 child 重啟了 max_restarts
次,就關閉自己,預設為在 5 秒內重啟 3 次
auto_shotdown
與正常的重啟規則無關,預設為 :never
,當他被設為 :any_significan
時,底下如果有 child_spect 的 significant 為 true 的 process 關閉時,會直接關閉,設為 :all_significan
則是全部的 significant children。