最近有開發一個任務調度里面最典型的應用發短信
關于如何實現任務調度,有很多方法,可以自己寫線程,也可以用一些開源方案,
我用了quartz,大家可以去查查資料
這里主要講講搶占式的好處
一般我們都會把要做的任務放一張表里面,有一個字段是狀態來標識是否已經執行過
。
比如我這個短信的,就有一張sendsms表
主要的字段有
sendid自增長標識符 content短信內容 recevies接收號碼 status 狀態(0標識未發
送,1發送過的)
我們很可能會寫這樣一個SQL
select sendid,content,recevies from sendsms where status='0'
然后邏輯處理完成,發送了之后根據sendid 去update sendsms set status='1'
當然如果只是一臺服務器需要掛這種發送短信的程序,這種方式沒有任何問題。
但是有時候我們可能希望有更多的服務器來做這件事情來提高效率,比如我們
還是用上面的方式,會出現什么樣的情況呢?
隨便想一下就知道,很可能會出現一條短信被發送兩次的情況,用的服務器越多,這種情況出現的概率就越大,那么我們怎么解決,我講講我使用的一種利用搶占資源來解決的方案
首先我們要給短信表增加一個字段,比如sid
我們要做的就是給每個服務器一個唯一的編號。sid就是用來存放它,比如現在有兩臺服務器一個標識為a,一個標識為b
我們還需要一個短信的中間狀態,待發送比如2
當任務調度執行到的時候這樣做
第一步,檢索這樣的記錄
select * from sendsms where status='2' and sid='a'
如果有這樣的記錄我們就執行發送任務
如果沒有這樣的記錄,我們就去搶占資源,也就是
updae sendsms set status='2',sid='a' where status='0'
這樣當下次任務調度到的時候,就有了資源,干活
而不同的服務器只要sid不同就可以了哦 這樣就算有很多的服務器都掛這個應用也不會出現一條記錄多次執行的情況了哦