漂J
半夜來問奇怪的技術問題時間

到底排程這種東西應該寫在 OS 設定 (crontab) 還是寫在 application 裡面呢?
漂J
寫在 application 的好處是絕對不會忘記設定,任何異動也都可以很明確的從 code 跟 git history 看出,但臨時要調整就缺乏彈性。
漂J
以 PHP 的 Laravel 5.2 為例 (5.2 算舊了但是只是舉例 XD),基本上 crontab 只有一個入口,詳細工作內容應該還是算寫在 application
任務排程 - Laravel - 為網頁藝術家創造的 PHP 框架
漂J
雖然這是 Node.js 不是 Laravel,但我還是在思考像這樣寫在 application 內到底算不算妥當
達人🐉☄️💫
摻在一起 讓 application 去改 crontab(誤
漂J
漂J
需要排程的工作內容是每天定時清理 MySQL 跟 Redis 的某些過時資料
漂J
理論上像這種不太有可能需要註解掉的工作,應該放在 application 內執行也沒問題?
apmk@住在「劏房」的
有什麼區別?在docker container裡跑cron就好。
crontab打包到docker裡。

不然你現在是怎樣做deployment?
漂J
apmk@住在「劏房」的 : 專案還沒 container 化
雖然很久以前想過,但因為這專案太多零碎的事情要處理,而且專案中間有一些奇奇怪怪的波折,貿然 container 化怕改動現有架構出問題會算在我頭上,所以就擺著沒動了
名無乚
我看過的是由系統排程呼叫一隻php去執行你講的工作,至於讓使用者操作開啟或是關閉或是修改的話,由網頁上的php去呼叫exec之類的系統指令
名無乚
或者,被呼叫的php會先去資料庫裡面找設定檔後再依照設定執行不同的事情
漂J
名無乚 : 如果排程裡面的 php 只是類似任務管理器或進入點的話,那這個就是很接近 Laravel 的作法
apmk@住在「劏房」的
沒container怕爆
漂J
這專案一路走來有點坎坷啊
我也想 container 化,但歷史因素導致以前沒能做到,現在要做又考慮不是只有我在維護,怕搞 breaking changes 會被人拿草人紮針
漂J
若想的長遠點,確實該大破大立,遲早得搞成容器管理
但我也不知道是否該把心力花在這種類型的專案上面
l• ܫ•) Davyキュルッ
把 systemd.timer 或 crontab 這種東西也放在 project 裡面
然後他們都只會去呼叫 application 執行
最後再把這些一起透過部屬腳本、容器、安裝包等等原有的部屬機制部屬進系統就好啦
漂J
l• ܫ•) Davyキュルッ : 所以果然大家都還是比較喜歡像 Laravel 那樣的作法嗎
l• ܫ•) Davyキュルッ
有什麼不好嗎
漂J
是沒有,只是好奇 XD
l• ܫ•) Davyキュルッ
這些東西也是你的業務邏輯之一不是嗎
而且退一百步來說好了 就算你用 shell script 操作
這些 script 也算是 application 的一部分哇
只是使用的語言不同 沒差吧
漂J
是沒錯,算是業務邏輯,
只是在思考單純全部放在 crontab,跟單純全部塞在 application (排程觸發的部分也全部交給 application 處理) 哪種比較好,看來還是應該像 Laravel 那樣排程只塞啟動器或管理器之類的
debɐnchery
apmk@住在「劏房」的
我覺得Laravel的作法可能有關照到一天跑一次的如果miss了剛好那分鐘,會再跑。又或會。下次retry。

視乎你的job有多重要,如果只是清清cache就沒差…
apmk@住在「劏房」的
我的app有幾百個scheduled task, 自己寫了個排程器
會重試 會多進程之類
l• ܫ•) Davyキュルッ
不知道為什麽噗主要思考全放某一邊的選項
邏輯用 app 的好處就是不用重新造輪子
排程用 crontab 的好處也是不用重新造輪子
除非以上情況不適用才要考慮造輪子吧?
漂J
l• ܫ•) Davyキュルッ : 理論上最簡單的方式應該是在 crontab 裡面新增:
e.g:
1 node app/tasks/some_task_1.js
2 node app/tasks/some_task_2.js
3 node app/tasks/some_task_3.js

但總覺得這樣零散的寫在 crontab 裡面,不知道會不會不好維護(?)
漂J
debɐnchery : 想說用現有的東西就好
漂J
apmk@住在「劏房」的 : 有道理,印象中 Laravel 那個好像的確可以 retry 的樣子
漂J
還是又是我小劇場太多,其實放在 crontab 根本也沒有不好維護的問題
l• ܫ•) Davyキュルッ
原來是不知道的部分 那就用用看哇
漂J
引入新輪子 -> 怕增加系統不必要的開銷
使用舊輪子 -> 怕沒組織性以後不好維護
小劇場太多
漂J
其實仔細想想,說不定根本不是技術面的問題
debɐnchery
離職後就通通都是別人的問題啦
l• ܫ•) Davyキュルッ
debɐnchery : 沒有吧 憑證過期也會回去通知前同事呢
漂J
l• ܫ•) Davyキュルッ : 因為當年部署的時候是我沒設定好嘛
離職前那週真的太忙了,沒時間處理完再走
漂J
而且那個不算前同事ㄅ
debɐnchery
載入新的回覆