漂J
@floatj
Wed, Jul 7, 2021 4:47 PM
1
半夜來問奇怪的技術問題時間
到底排程這種東西應該寫在 OS 設定 (crontab) 還是寫在 application 裡面呢?
漂J
@floatj
Wed, Jul 7, 2021 4:48 PM
寫在 application 的好處是絕對不會忘記設定,任何異動也都可以很明確的從 code 跟 git history 看出,但臨時要調整就缺乏彈性。
漂J
@floatj
Wed, Jul 7, 2021 4:50 PM
Wed, Jul 7, 2021 4:55 PM
以 PHP 的 Laravel 5.2 為例 (5.2 算舊了但是只是舉例 XD),基本上 crontab 只有一個入口,詳細工作內容應該還是算寫在 application
任務排程 - Laravel - 為網頁藝術家創造的 PHP 框架
漂J
@floatj
Wed, Jul 7, 2021 4:50 PM
雖然這是 Node.js 不是 Laravel,但我還是在思考像這樣寫在 application 內到底算不算妥當
達人🐉☄️💫
@c910335
Wed, Jul 7, 2021 4:55 PM
摻在一起 讓 application 去改 crontab(誤
漂J
@floatj
Wed, Jul 7, 2021 4:55 PM
達人🐉☄️💫
:
漂J
@floatj
Wed, Jul 7, 2021 4:56 PM
需要排程的工作內容是每天定時清理 MySQL 跟 Redis 的某些過時資料
漂J
@floatj
Wed, Jul 7, 2021 4:56 PM
理論上像這種不太有可能需要註解掉的工作,應該放在 application 內執行也沒問題?
apmk@住在「劏房」的
@apmk
Wed, Jul 7, 2021 4:57 PM
Wed, Jul 7, 2021 4:58 PM
有什麼區別?在docker container裡跑cron就好。
crontab打包到docker裡。
不然你現在是怎樣做deployment?
漂J
@floatj
Wed, Jul 7, 2021 4:59 PM
apmk@住在「劏房」的
: 專案還沒 container 化
雖然很久以前想過,但因為這專案太多零碎的事情要處理,而且專案中間有一些奇奇怪怪的波折,貿然 container 化怕改動現有架構出問題
會算在我頭上
,所以就擺著沒動了
名無乚
@DoTaMoonNight
Wed, Jul 7, 2021 5:00 PM
我看過的是由系統排程呼叫一隻php去執行你講的工作,至於讓使用者操作開啟或是關閉或是修改的話,由網頁上的php去呼叫exec之類的系統指令
名無乚
@DoTaMoonNight
Wed, Jul 7, 2021 5:01 PM
或者,被呼叫的php會先去資料庫裡面找設定檔後再依照設定執行不同的事情
漂J
@floatj
Wed, Jul 7, 2021 5:01 PM
名無乚
:
如果排程裡面的 php 只是類似任務管理器或進入點的話,那這個就是很接近 Laravel 的作法
apmk@住在「劏房」的
@apmk
Wed, Jul 7, 2021 5:18 PM
沒container怕爆
漂J
@floatj
Wed, Jul 7, 2021 5:23 PM
這專案一路走來有點坎坷啊
我也想 container 化,但歷史因素導致以前沒能做到,現在要做又考慮不是只有我在維護,怕搞 breaking changes 會被人拿草人紮針
漂J
@floatj
Wed, Jul 7, 2021 5:29 PM
若想的長遠點,確實該大破大立,遲早得搞成容器管理
但我也不知道是否該把心力花在
這種類型
的專案上面
l• ܫ•) Davyキュルッ
@david50407
Wed, Jul 7, 2021 5:51 PM
把 systemd.timer 或 crontab 這種東西也放在 project 裡面
然後他們都只會去呼叫 application 執行
最後再把這些一起透過部屬腳本、容器、安裝包等等原有的部屬機制部屬進系統就好啦
漂J
@floatj
Wed, Jul 7, 2021 5:55 PM
l• ܫ•) Davyキュルッ
: 所以果然大家都還是比較喜歡像 Laravel 那樣的作法嗎
l• ܫ•) Davyキュルッ
@david50407
Wed, Jul 7, 2021 5:57 PM
有什麼不好嗎
漂J
@floatj
Wed, Jul 7, 2021 6:01 PM
是沒有,只是好奇 XD
l• ܫ•) Davyキュルッ
@david50407
Wed, Jul 7, 2021 6:06 PM
這些東西也是你的業務邏輯之一不是嗎
而且退一百步來說好了 就算你用 shell script 操作
這些 script 也算是 application 的一部分哇
只是使用的語言不同 沒差吧
漂J
@floatj
Wed, Jul 7, 2021 6:10 PM
是沒錯,算是業務邏輯,
只是在思考單純全部放在 crontab,跟單純全部塞在 application (排程觸發的部分也全部交給 application 處理) 哪種比較好,看來還是應該像 Laravel 那樣排程只塞啟動器或管理器之類的
debɐnchery
@xatierlike
Wed, Jul 7, 2021 10:38 PM
當然是 ansible 阿
ansible.builtin.cron – Manage cron.d and crontab ent...
apmk@住在「劏房」的
@apmk
Thu, Jul 8, 2021 1:09 AM
Thu, Jul 8, 2021 1:09 AM
我覺得Laravel的作法可能有關照到一天跑一次的如果miss了剛好那分鐘,會再跑。又或會。下次retry。
視乎你的job有多重要,如果只是清清cache就沒差…
apmk@住在「劏房」的
@apmk
Thu, Jul 8, 2021 1:23 AM
我的app有幾百個scheduled task, 自己寫了個排程器
會重試 會多進程之類
l• ܫ•) Davyキュルッ
@david50407
Thu, Jul 8, 2021 1:50 AM
不知道為什麽噗主要思考全放某一邊的選項
邏輯用 app 的好處就是不用重新造輪子
排程用 crontab 的好處也是不用重新造輪子
除非以上情況不適用才要考慮造輪子吧?
漂J
@floatj
Thu, Jul 8, 2021 2:45 AM
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
@floatj
Thu, Jul 8, 2021 2:46 AM
debɐnchery
: 想說用現有的東西就好
漂J
@floatj
Thu, Jul 8, 2021 2:47 AM
apmk@住在「劏房」的
: 有道理,印象中 Laravel 那個好像的確可以 retry 的樣子
漂J
@floatj
Thu, Jul 8, 2021 2:47 AM
還是又是我小劇場太多,其實放在 crontab 根本也沒有不好維護的問題
l• ܫ•) Davyキュルッ
@david50407
Thu, Jul 8, 2021 3:01 AM
原來是不知道的部分 那就用用看哇
漂J
@floatj
Thu, Jul 8, 2021 3:05 AM
引入新輪子 -> 怕增加系統不必要的開銷
使用舊輪子 -> 怕沒組織性以後不好維護
小劇場太多
漂J
@floatj
Thu, Jul 8, 2021 3:06 AM
其實仔細想想,說不定根本不是技術面的問題
debɐnchery
@xatierlike
Thu, Jul 8, 2021 8:53 AM
離職後就通通都是別人的問題啦
l• ܫ•) Davyキュルッ
@david50407
Thu, Jul 8, 2021 9:22 AM
debɐnchery
: 沒有吧 憑證過期也會回去通知前同事呢
漂J
@floatj
Thu, Jul 8, 2021 9:27 AM
l• ܫ•) Davyキュルッ
: 因為當年部署的時候是我沒設定好嘛
離職前那週真的太忙了,沒時間處理完再走
漂J
@floatj
Thu, Jul 8, 2021 9:27 AM
而且那個不算前同事ㄅ
debɐnchery
@xatierlike
Thu, Jul 8, 2021 10:51 AM
l• ܫ•) Davyキュルッ
: 哇
載入新的回覆
到底排程這種東西應該寫在 OS 設定 (crontab) 還是寫在 application 裡面呢?
任務排程 - Laravel - 為網頁藝術家創造的 PHP 框架
crontab打包到docker裡。
不然你現在是怎樣做deployment?
雖然很久以前想過,但因為這專案太多零碎的事情要處理,而且專案中間有一些奇奇怪怪的波折,貿然 container 化怕改動現有架構出問題
會算在我頭上,所以就擺著沒動了沒container怕爆我也想 container 化,但歷史因素導致以前沒能做到,現在要做又考慮不是只有我在維護,怕搞 breaking changes 會被人拿草人紮針
但我也不知道是否該把心力花在這種類型的專案上面
然後他們都只會去呼叫 application 執行
最後再把這些一起透過部屬腳本、容器、安裝包等等原有的部屬機制部屬進系統就好啦
而且退一百步來說好了 就算你用 shell script 操作
這些 script 也算是 application 的一部分哇
只是使用的語言不同 沒差吧
只是在思考單純全部放在 crontab,跟單純全部塞在 application (排程觸發的部分也全部交給 application 處理) 哪種比較好,看來還是應該像 Laravel 那樣排程只塞啟動器或管理器之類的
ansible.builtin.cron – Manage cron.d and crontab ent...
視乎你的job有多重要,如果只是清清cache就沒差…
會重試 會多進程之類
邏輯用 app 的好處就是不用重新造輪子
排程用 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 裡面,不知道會不會不好維護(?)
還是又是我小劇場太多,其實放在 crontab 根本也沒有不好維護的問題使用舊輪子 -> 怕沒組織性以後不好維護
小劇場太多其實仔細想想,說不定根本不是技術面的問題離職後就通通都是別人的問題啦離職前那週真的太忙了,沒時間處理完再走
而且那個不算前同事ㄅ