先介紹下基本概念。java
咱們在編寫程序時,偶爾會遇到須要用到異步隊列的狀況。好比說,我發送一萬封郵件,若是單純使用一個for循環來發送,則執行時間要很長,要等好久才能發完,同時很容易致使阻塞、超時等問題。當郵件更多,好比一百萬封的時候,問題會更加明顯。這時最好的解決方案就是把這十萬封郵件排隊,一一發出去。這就是任務隊列的概念。node
而且,咱們並不須要等到十萬封郵件都發送完畢後纔在網站前臺通知用戶。咱們能夠把郵件一入隊列,就通知用戶。這樣,用戶等待的時間就不是漫長的「發十萬封郵件」的時間,而是「把十萬封郵件排隊」的時間。所以能明顯地縮短了用戶等待時間。這就是異步的概念。git
HTQ ,全稱 Http Task Queue ,是一個以Http方式執行異步任務的隊列服務。你能夠推送若干url進HTQ隊列,HTQ會以Http GET 的方式訪問這些url。若是url所在的腳本寫上各類具體的任務操做,如發送郵件等,即可以實現異步操做了。HTQ使用node.js編寫,可跟各類後臺語言如PHP、java配合使用以加強異步處理能力。目前支持的隊列類型有實時異步隊列、定時異步隊列、可變異步隊列。github
若是你依然對HTQ陌生,則可往下看詳細的應用場景以加深瞭解。redis
一、實時異步隊列npm
所謂實時,指的是把任務一推動隊列就立刻執行。一個典型的應用場景就是咱們上面所說的發送郵件。郵件推送進任務隊列,隊列立刻把它發出去。若是它推動隊列後有其餘郵件正在發送中,它則等待當前郵件發送完畢後才發送。json
除了發郵件,咱們在發文章、發微博、發評論的時候均可以用得上HTQ的實時任務隊列,尤爲是數量很是大的時候。好比評論用戶太多,若是一瞬間讓服務器處理,服務器可能由於支撐不了過高的併發從而形成阻塞。這個時候就可讓評論們進入隊列再一一處理。安全
二、定時異步隊列服務器
定時,顧名思義,就是在特定的時間執行任務隊列。這種隊列服務可用於定時郵件、定時短信。須要說明的是,這裏的定時,不必定是精準的定時。假如你設置了明天12點執行某個任務,那麼,它在明天12點的時候將進入隊列。假如隊列中已經有任務在執行,那麼它會等待到前面的任務完畢才執行。此時多是12點01分鐘才執行。網絡
三、可變隊列
咱們推送10個任務進隊列,這10個隊列會反覆循環地執行,而且它們的執行快慢可以根據返回狀況進行調整,這就是可變隊列。好比,咱們作掃描監控,會反覆地執行「掃描」這個任務。咱們但願,在有異常狀況的時候,能加快掃描的速度以便更快速地發現問題;而在沒有長期異常的狀況能減慢一下掃描速度以節省機器資源。
再舉一個場景例子,經過API拉取微博新動態。咱們網站上有10萬綁定了新浪微博的用戶,咱們須要時常獲取他們的最新動態以展現在咱們的網站的用戶主頁上。 若是是採用定時獲取動態的方式,那麼,假設1分鐘能獲取1千個用戶的動態(由於受API使用頻率和網絡等緣由限制,咱們獲取不了太快。這裏先假設一個數字),那麼,獲取完全部用戶狀態須要100分鐘。對用戶來講,他在微博更新動態後,100分鐘後才顯示到咱們網站。這明顯滯後太多。有沒有辦法加快點呢?此時可使用HTQ的可變隊列。可變隊列會對長期沒有更新動態的那部分不活躍用戶進行減緩速度,減緩對他們微博的獲取頻率,同時加大對活躍用戶的獲取頻率。這樣,一個活躍用戶更新微博後,可能10分鐘就能同步到咱們網站了。對於不活躍用戶,可能獲取時間會變長了些,但沒關係,咱們願意分配更多的資源去知足活躍用戶的需求。
使用可變隊列,能讓咱們有所側重地使用咱們的資源,以減小浪費、增長利用率。
一、安裝
首先安裝好node環境和redis服務,請參考:http://nodejs.cn/download/ 和 http://redis.io/download
clone或下載代碼:https://github.com/star7th/htq
下載到你想要放置的目錄,命令行進入該目錄,執行命令:
npm install
安裝完畢後,執行如下命令啓動:
node htq.js
上面這種啓動方式是臨時運行的,關閉命令行窗口就會中止了。若是想一直在後臺運行,則可:
nohup node htq.js > ~/htq.log 2>&1 &
若是想關閉退出,可運行:
killall -9 node
二、如何使用
啓動後,HTQ默認監聽本機的5999端口。你能夠經過此端口訪問HTQ的APi,以添加隊列和任務。詳細的API文檔可看:http://www.showdoc.cc/htq?page_id=37198
你能夠根據API文檔來在你的項目中調用API以新建任務。官方提供了一個PHP調用的SDK(在/PHPSDK目錄)。歡迎其餘語言的開發者也將HTQ的API封裝成其餘語言的SDK
若是要修改默認端口以及默認的redis地址,可修改配置文件config.json。修改完畢需重啓HTQ才能生效
一、程序安全
訪問HTQ 的API時須要填寫簡單的token認證,認證信息在配置文件config.json裏定義。爲了安全起見,你能夠在下載代碼將token設置爲其餘隨機數。若是你已經啓動了HTQ,則須要關閉後再重啓才能讓新配置生效。
若是你擔憂直接執行url會帶來安全隱患,怕本身暴露的url被外部訪問,那你能夠在推送進HTQ的url上帶參數簽名校驗。而後在url觸發的任務腳步裏檢驗簽名便可。
二、數據安全
HTQ使用redis來儲存隊列。Redis自身帶有持久化功能。如另外須要對數據進行備份,則備份redis便可,不用在業務中實現數據備份。
三、正確性
HTQ能執行url,但不能保證業務上的正確。好比說HTQ確實是觸發了發文章的腳本,然而這個腳步可能自身由於網絡緣由發佈文章失敗。此時應該在業務層作好相應的容錯處理,好比讓該url從新入隊列。