iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

你有試過重開嗎?

https://ithelp.ithome.com.tw/upload/images/20241002/2014105438yWG1bRRQ.png

除了一般的錯誤處理,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_secondmax_restarts 決定了什麼時候要關閉自己。在 max_second 裡如果 child 重啟了 max_restarts 次,就關閉自己,預設為在 5 秒內重啟 3 次

auto_shotdown 與正常的重啟規則無關,預設為 :never,當他被設為 :any_significan 時,底下如果有 child_spect 的 significant 為 true 的 process 關閉時,會直接關閉,設為 :all_significan 則是全部的 significant children。


上一篇
17 child_spec
下一篇
19 Observer
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言