feng

飘逸~~~~~life

My Links

Blog Stats

常用链接

留言簿(3)

随笔档案

文章档案

相册

友情链接

搜索

最新评论

阅读排行榜

评论排行榜

抢占式任务调度的一种实现


最近有开发一个任务调度里面最典型的应用发短信
关于如何实现任务调度,有很多方法,可以自己写线程,也可以用一些开源方案,
我用了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不同就可以了哦  这样就算有很多的服务器都挂这个应用也不会出现一条记录多次执行的情况了哦


 

posted on 2009-06-26 16:32 feng 阅读(2672) 评论(8)  编辑  收藏

Feedback

# re: 抢占式任务调度的一种实现 2009-06-26 17:11 bigbigbig

会不会出现这种情况
服务器一抢占资源,在服务器一准备发送过程中,资源被服务器二抢占,就这样一直重复。导致服务器一直在抢占资源,无法发送资源呢?  回复  更多评论   

# re: 抢占式任务调度的一种实现[未登录] 2009-06-27 01:56 小黑

master程序调度所有服务器进行发送 master的职责是分配,其它服务器的职责是发送,  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-06-27 13:54 feng

不会出现你说的这种情况,可能你还没有看明白吧 抢占的时候只是去抢占第一状态的记录,在本应用既状态为0的记录,而服务器发送的是双条件,其中状态为2的待发送记录@bigbigbig
  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-06-27 23:31 俊星

不错,不知道抢占式会不会影响多服务器的效率(一个服务器抢占了过多资源,其他服务器没事干了)。  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-06-28 00:36 bigbigbig

嗯,看明白了。@feng

既然是抢占式吗,肯定是谁抢到谁干活啊,没抢到就歇着呗,呵呵。@俊星  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-06-29 20:06 java狼

博主,我们现在的系统的对任务的调度方式就是你文中描述的方式。现在很想知道用Quartz的话有什么好处吗?我粗浅的了解了下,感觉和我们现在cron调用脚本的方式没有太大的区别啊。其实我最感兴趣的是如何在多服务器的并发情况下保证不会出现并发冲突,Quartz解决这个问题很方便吗?  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-06-30 09:13 feng

我原先是自己写了单线程去跑的,但是如果遇到了异常,很可是能这个单线程就会终止,任务就不会做下去,于是后来改成了Quartz,目的就是希望任务总是能执行,效果也确实是这样的,但是Quartz发布到WEB应用有些奇怪的地方,可能会出现执行多次的情况,后来我采用虚拟目录发布就解决了@java狼
  回复  更多评论   

# re: 抢占式任务调度的一种实现 2009-07-01 13:27 找个美女做老婆

Java高手群:Java乐园,群号:28840096 Java乐园网站:http://www.javaly.cn 欢迎Java高手加入,大家一起交流经验,相互学习,共同进步  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问