Friday, October 27, 2017

要不要用 cronjob ?

要不要使用 cronjob ,我覺得這是一個設計的問題:

我最近在重構的一隻 Script ,它做了下列幾件事:
(1) 每分鐘執行一次,依賴 cronjob 來啟動
(2) 每次執行,它都會呼叫數個外部的 http API

如果考慮布署的方便性,其實我可以考慮把 cron 的部分,直接在 script 裡做掉。這樣子 Devops team 就不用設定 cronjob ,Devops 的成本會比較低。此外,cronjob 因為是系統共用的,有時候運氣不好,就被改掉了。

另一方面,如果是讓 script 自行做 scheduling 的話,我就必須考慮 exception handling 。因為呼叫 API ,有時候網路如果斷掉,就會產生 exception 。產生 exception 的話,有時候整個程式就 crush 掉了,甚至連下一週期也受到波及。然後,我想有想到 Erlang 的設計就是每個 process 都是完全獨立的。任何一個 process 就算 crush 掉也沒有關系。照這個想法的話,用 cronjob 來跑的 script ,每一次的執行也都是獨立的 執行環境,確實也比較簡單。

上網查了一下:似乎也有其它人跟我有類似的疑問? 解法也很妙,還分成兩類:
(1) ofelia 的解法是,重新實作一個類似的 cron 的程式。但是適合跟 docker 合作。
(2) supercronic 的解法則是,實作一個適合在 docker 內部執行的 cron