Ruby / Rails 武器的選擇


#1

嗯 … 看到很多人包括新手遇到相同的問題無法解決,所以寫在這邊一次描述清楚好了

首先,如果你會 Rails ,很抱歉的,你擁有的只是一把左輪手槍罷了,而且你拋棄了近戰最活用的小刀和團戰用的格林機槍,sidekiq?那只是左輪手槍上狙擊鏡罷了,本質還是沒有改變的,okay,回到問題本質的分析:

Rails

適合大量併發,工作彼此獨立:簡單的來說一個人來網站 / 登入 / 操作,都是一件事情,然後做到完就結束,把結果回傳而已,而 Web 上面 80% 都是這樣的工作,包括 API 系列也可以勝任

Sidekiq

等待執行,不要卡住,其實就是他真正的名稱:Delay Job,Rails 上面有一票工作需要等待的,類似傳送簡訊,寄送 mail,這些動作都需要依些時間才能完成,可是你又不該讓這些時間卡住使用者的操作和回應,所以就 push 到 Redis 的 queue 內(可以看成 Array)讓 Sidekiq 可以定時去 pop 出來做完後續的工作而已,而 Sidekiq 一次會開類似 25 個 thread pool 來把 pop 出來的工作彼此分配掉,所以一次可以做 25 件煩人的工作,且做完重取即可

一般來說新手到上面就停止了,但缺了很多東西,而最重要的東西莫過於…

簡易工作排程

每天 12 點該做些什麼東西,每一秒鐘該做什麼東西,類似有人問的廣告推播系統,機器人整點回應等等,這種東西一般來說大都會寫成 conjob / contab,Linux 下的老問題了,類似每天每週的安全性更新 / 清理 / Log分段等等,所以用 conjob 系列可以找到一票的文章,Ruby 下有 conjob 的 tool 叫 whenever

不過這東西很蠢,其實就是 conjob 的翻版,啟動依據還是要用 conjob,所以通常我都會用這篇來完成

自幹無敵哈哈,這類型的工作有個極大的缺點,最小單位為 1 分鐘,且可能會"累積",也就是類似你不小心把 backup DB 寫成了每分鐘執行(相信我,很常發生,類似寫成 * 1 * * * 然後期望每天晚上一點時跑一次!?但其實這寫法是一點的每分鐘都會跑一次…),然後 1 分鐘內沒完成,就會出現第二個 process,30 分鐘後就出現了 30 個,整台電腦就幾乎不會動了|||(不過當然有例外,類似你可以用 file lock[flock] 來讓第一支執行的程式先拿到且不釋放{要存成 global var 否則會被釋放掉|||},第二支拿不到則直接結束即可,文件在這 https://ruby-doc.org/core-1.9.3/File.html

所以目前自已身上很小的事務我才會丟到 conjob 去,類似開開發票備存些啥鬼或清理有的沒的

進階工作排程

記得以前看到最簡易的 OS 寫法的起始端,是類似從這樣的語法開始

loop do
  ...
end

okay,之後學習中我就懂怎樣開始寫機器人了哈哈,看似很蠢但其實是所有的開端,事實上一票的 daemon 系列也都這樣寫,類似你在 loop 內瘋狂檢查目前時間多少該做什麼事情,然後讓這支程式不要死掉,你就完成了 80% 的主幹架構了,且控制時間可以到達奈秒等級,好東西不用嗎?

這邊我曾經寫過用 god 的文章,一個讓你的 process 不會死的 watch dog

而 youtube 影片有這個 rufus-scheduler

的簡易排程機器人的教學

有這兩個武器你就幾乎可以做完所有排程的項目,包括『即時回應』這件事情,而所謂的即時回應其實並不是『即時回應』,你可以和 sidekiq 一樣,在 web 端先塞到 redis 的 queue 內,然後使用精確排程,在一分鐘 / 一秒鐘 / 一奈秒一次的全部做完,這都叫做即時回應系統,取決於問題的複雜度罷了,而 rufus-scheduler 基本上可以控制在一秒左右沒問題(以下的我沒測過就是,不過應該也可以才是)

anyway 以上,如果你只有 Rails 的功力不是可惜很多嗎?花點時間練一下純 Ruby,然後寫看看唄 … : )