Heroku Scheduler

PaaS平台 Heroku本身提供了多種批次執行add-on,我自己試過幾套後,覺得Heroku Scheduler還算堪用,特別是當你一天要執行多次批次程式,而之前介紹的IronWorker一個月10小時免費額度又不夠時。

Heroku Scheduler沒有執行時間的限制,也不會動用到Dyno的運算時間 (即使Dyno關閉,scheduled job還是可以執行,事實上它使用的是另一種稱為One-off Dyno的運算容器)。同時也支援Python、Node.JS、Ruby等程式語言。

前置作業

本篇以node.js為例,但 Heroku Scheduler官方文件對於node.js的說明琢磨甚少,我是查詢stockoverflow之後,才試出來的。下面這個前置作業很重要:

在程式佈署之前,要先在新增bin資料夾,並將node.js欲執行的主程式(例如server.js)複製到bin資料夾中,然後刪除副檔名(原本是server.js改成server,事實上檔名叫什麼都可以,只要不要副檔名即可), 在程式佈署之後,Heroku Scheduler會執行bin底下的程式,不會執行實際上的node.js主程式。

程式佈署

Heroku提供三種佈署程式的方法:使用git命令列、整合GitHub、整合Dropbox。在程式佈署之前,程式會先簽入到遠端的git repo,再根據node.js的package.son做套件的安裝。

如果不熟悉git命令列指令,而你的程式碼在GitHub託管的話,用整合GitHub的方式來佈署會比較方面,經過OAuth認證整合你的GitHub帳號,然後選取需要佈署的專案。這裡可以設定自動佈署,或者使用手動佈署的方式來上程式。自動佈署是當你的程式簽入到GitHub之後,Heroku偵測到有牽入成功的動作,就會自動執行程式佈署。



或者使用手動佈署,按下「Deploy Branch」,就開始佈署, 在佈署過程中的Log會顯示在下方。如果專案有多個分支,還可以選取特定的分支來佈署。

前面提到,程式碼佈署之前會先被簽入到遠端的git repo,因此在Activity畫面,不但看得到每次佈署的紀錄,還可以比較版本差異,並做roll back的動作,將程式回復到任何一個版本。以上的動作全在網頁上就可以完成,這是我認為Heroku對開發者最友善的部分。

排程設定

程式佈署成功之後,回到Resources頁面,會多出一個Free dynos,但Heroku Schedule不會用到這裡的dyno容器,不需要開啟它。在下方的Add-ons,搜尋「Heroku Scheduler」,找到之後,將其加入。

加入Heroku Scheduler Add-on之後,點選進入Heroku Scheduler管理頁面。這裡會列出所有已排程的工作,第一次進入是空的,我們可以「Add new job」來增加新的排程。
 點選「Add new job」之後,會出現下面的畫面。以node.js為例,這裡的指令只需要輸入bin資料夾裡的程式名稱(檔名),如果程式有參數,將參數加在後面,除此之外不需要其他的指令。

排程時間,最短間隔只允許十分鐘執行一次。

排程時間小技巧:破除十分鐘執行一次的限制

Heroku Scheduler最短只能十分鐘執行一次,但如果我要五分鐘執行一次,怎麼做?辦法是人想出來的,排入兩個排程,兩排程的時間相隔五分鐘就行了(見下圖)!但要注意,若排程執行過久(超過五分鐘),造成有兩個程式同時執行的狀況,程式邏輯本身就要考慮到程式不要互咬,例如原本是寫入一個temp table,現在就需要兩個temp table。

查看執行紀錄

Heroku Scheduler無法從網頁上查詢城市的執行紀錄,只能透過Heroku Toolbelt用戶端開發工具下指令來查詢,指令如下:
heroku logs --app 

結語

Heroku Scheduler雖然不如之前介紹過的IronWorker有強大的網頁介面,但這個服務完全免費,非常適合大量批次程式的執行需求。不過,Heroku本身是建構在AWS上,若AWS不穩定會連帶影響到Heroku的所有服務,例如2015/9/20就發生過服務中斷七個小時的紀錄。不過雲端服務本來就不是最穩定的,Heroku也提供了網頁可以查看服務的狀態



相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Chrome 的檔案續傳功能

Mac與Android裝置傳輸檔案的方法

使用 Vysor 在電腦上控制 Android 裝置