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