原文:http://blog.nosqlfan.com/html/3223.html
RabbitMQ是当成应用比较广泛的队列服务系统,其配套的客户端和监控运维方案也比较成熟。BoxedIce的队列服务从今年四月开始从RabbitMQ切换到了MongoDB上,并一直稳定运行至今,下面是BoxedIce对队列系统的一个讨论PPT及相关叙述。分享给大家。
任务处理进程的工作,就是从队列中读出消息,并且处理这个消息。所以它需要一种能够从队列中取出元素进行处理的能力。RabbitMQ提供了AMQP协议,目前已经有许多基于此协议的客户端了,相对的,MongoDB基于其Mongo Wire Protocol协议也拥有丰富的客户端支持。
BoxedIce在使用RabbitMQ时是用的pika客户端,转为MongoDB后使用的是pymongo。这两个协议相对比,pymongo的开销要小很多。
对于原子性,RabbitMQ通过对consume/ack协议的支持来实现。而由于MongoDB只支持对单个文档的原子性个性,所以你可以使用其findAndModify 命令,简单语法如下:
db.runCommand( { findAndModify : collection, { options } } )
这里的options是一个数组,其包含下面一些元素:
上面我们在处理消息的时候会将其inProg设置为true表示正在处理,当成功处理完成后,再将done设置为true,但如果处理过程中出现问 题,就会导致一个inProg为true但是done永远为false的任务。这时候就需要垃圾回收策略通过检查处理时间t来进行垃圾回收处理了。
now = datetime.datetime.now() difference = datetime.timedelta(seconds=10) timeout = now - difference queue.find({‘inProg‘ : True, ‘start‘ : {‘$lte‘ : timeout} })
比如上面的代码,我们通过判断t是否是在当前时间10秒以前来判断是否过期(10秒都未处理完,我们认为任务处理失败),这些失败的消息我们可以进行相关的处理,让它重新加入到消息队列中。
除了上面说到的速度,原子性等特性,对于一个队列系统,还是有一些其它方面需要考虑的。
用MongoDB取代RabbitMQ(转),布布扣,bubuko.com
原文地址:http://www.cnblogs.com/ajianbeyourself/p/3847645.html