feng

          飄逸~~~~~life

          搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn)


          最近有開(kāi)發(fā)一個(gè)任務(wù)調(diào)度里面最典型的應(yīng)用發(fā)短信
          關(guān)于如何實(shí)現(xiàn)任務(wù)調(diào)度,有很多方法,可以自己寫(xiě)線程,也可以用一些開(kāi)源方案,
          我用了quartz,大家可以去查查資料
          這里主要講講搶占式的好處
          一般我們都會(huì)把要做的任務(wù)放一張表里面,有一個(gè)字段是狀態(tài)來(lái)標(biāo)識(shí)是否已經(jīng)執(zhí)行過(guò)


          比如我這個(gè)短信的,就有一張sendsms表
          主要的字段有
          sendid自增長(zhǎng)標(biāo)識(shí)符 content短信內(nèi)容  recevies接收號(hào)碼 status 狀態(tài)(0標(biāo)識(shí)未發(fā)

          送,1發(fā)送過(guò)的)
          我們很可能會(huì)寫(xiě)這樣一個(gè)SQL
          select sendid,content,recevies from sendsms where status='0'
          然后邏輯處理完成,發(fā)送了之后根據(jù)sendid 去update sendsms set status='1'
          當(dāng)然如果只是一臺(tái)服務(wù)器需要掛這種發(fā)送短信的程序,這種方式?jīng)]有任何問(wèn)題。
          但是有時(shí)候我們可能希望有更多的服務(wù)器來(lái)做這件事情來(lái)提高效率,比如我們
          還是用上面的方式,會(huì)出現(xiàn)什么樣的情況呢?
          隨便想一下就知道,很可能會(huì)出現(xiàn)一條短信被發(fā)送兩次的情況,用的服務(wù)器越多,這種情況出現(xiàn)的概率就越大,那么我們?cè)趺唇鉀Q,我講講我使用的一種利用搶占資源來(lái)解決的方案
          首先我們要給短信表增加一個(gè)字段,比如sid
          我們要做的就是給每個(gè)服務(wù)器一個(gè)唯一的編號(hào)。sid就是用來(lái)存放它,比如現(xiàn)在有兩臺(tái)服務(wù)器一個(gè)標(biāo)識(shí)為a,一個(gè)標(biāo)識(shí)為b
          我們還需要一個(gè)短信的中間狀態(tài),待發(fā)送比如2
          當(dāng)任務(wù)調(diào)度執(zhí)行到的時(shí)候這樣做
          第一步,檢索這樣的記錄
          select * from sendsms where status='2' and sid='a'
          如果有這樣的記錄我們就執(zhí)行發(fā)送任務(wù)
          如果沒(méi)有這樣的記錄,我們就去搶占資源,也就是
          updae sendsms set status='2',sid='a' where status='0'
          這樣當(dāng)下次任務(wù)調(diào)度到的時(shí)候,就有了資源,干活

          而不同的服務(wù)器只要sid不同就可以了哦  這樣就算有很多的服務(wù)器都掛這個(gè)應(yīng)用也不會(huì)出現(xiàn)一條記錄多次執(zhí)行的情況了哦


           

          posted on 2009-06-26 16:32 feng 閱讀(2689) 評(píng)論(8)  編輯  收藏

          Feedback

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-26 17:11 bigbigbig

          會(huì)不會(huì)出現(xiàn)這種情況
          服務(wù)器一搶占資源,在服務(wù)器一準(zhǔn)備發(fā)送過(guò)程中,資源被服務(wù)器二搶占,就這樣一直重復(fù)。導(dǎo)致服務(wù)器一直在搶占資源,無(wú)法發(fā)送資源呢?  回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn)[未登錄](méi) 2009-06-27 01:56 小黑

          master程序調(diào)度所有服務(wù)器進(jìn)行發(fā)送 master的職責(zé)是分配,其它服務(wù)器的職責(zé)是發(fā)送,  回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-27 13:54 feng

          不會(huì)出現(xiàn)你說(shuō)的這種情況,可能你還沒(méi)有看明白吧 搶占的時(shí)候只是去搶占第一狀態(tài)的記錄,在本應(yīng)用既狀態(tài)為0的記錄,而服務(wù)器發(fā)送的是雙條件,其中狀態(tài)為2的待發(fā)送記錄@bigbigbig
            回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-27 23:31 俊星

          不錯(cuò),不知道搶占式會(huì)不會(huì)影響多服務(wù)器的效率(一個(gè)服務(wù)器搶占了過(guò)多資源,其他服務(wù)器沒(méi)事干了)。  回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-28 00:36 bigbigbig

          嗯,看明白了。@feng

          既然是搶占式嗎,肯定是誰(shuí)搶到誰(shuí)干活啊,沒(méi)搶到就歇著唄,呵呵。@俊星  回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-29 20:06 java狼

          博主,我們現(xiàn)在的系統(tǒng)的對(duì)任務(wù)的調(diào)度方式就是你文中描述的方式。現(xiàn)在很想知道用Quartz的話有什么好處嗎?我粗淺的了解了下,感覺(jué)和我們現(xiàn)在cron調(diào)用腳本的方式?jīng)]有太大的區(qū)別啊。其實(shí)我最感興趣的是如何在多服務(wù)器的并發(fā)情況下保證不會(huì)出現(xiàn)并發(fā)沖突,Quartz解決這個(gè)問(wèn)題很方便嗎?  回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-06-30 09:13 feng

          我原先是自己寫(xiě)了單線程去跑的,但是如果遇到了異常,很可是能這個(gè)單線程就會(huì)終止,任務(wù)就不會(huì)做下去,于是后來(lái)改成了Quartz,目的就是希望任務(wù)總是能執(zhí)行,效果也確實(shí)是這樣的,但是Quartz發(fā)布到WEB應(yīng)用有些奇怪的地方,可能會(huì)出現(xiàn)執(zhí)行多次的情況,后來(lái)我采用虛擬目錄發(fā)布就解決了@java狼
            回復(fù)  更多評(píng)論   

          # re: 搶占式任務(wù)調(diào)度的一種實(shí)現(xiàn) 2009-07-01 13:27 找個(gè)美女做老婆

          Java高手群:Java樂(lè)園,群號(hào):28840096 Java樂(lè)園網(wǎng)站:http://www.javaly.cn 歡迎Java高手加入,大家一起交流經(jīng)驗(yàn),相互學(xué)習(xí),共同進(jìn)步  回復(fù)  更多評(píng)論   



          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 仁化县| 临泽县| 屯昌县| 通化县| 闸北区| 唐海县| 梓潼县| 安化县| 和平区| 德庆县| 阜城县| 平谷区| 沁源县| 丰镇市| 沭阳县| 西峡县| 清丰县| 灵山县| 武宣县| 揭阳市| 彭州市| 雷波县| 社旗县| 奉贤区| 沽源县| 玉龙| 巴塘县| 开封市| 介休市| 基隆市| 陇南市| 蕲春县| 五家渠市| 南丹县| 平定县| 西华县| 贵德县| 平遥县| 鄂伦春自治旗| 霍邱县| 龙州县|