前言:

     使用mongodb做任务队列管理支持增删改 ,我是喜欢用redis的list做队列的,但是这边经常堆积任务,需要判断队列是否存在这个key并删除清空队列,有可能会根据一些content的字段来进行删除,有可能是会针对发件人,或者是时间段来删除,更有傻逼的还要求可以修改文件的内容。 

Hello , 原文地址是 blog.xiaorui.cc

      这个时候用redis真的不太适合了,因为redis的队列只能是一条条的记录而已,当然咱们也可以只是存一个任务id,然后放到redis hash来做。处理的时候,处理的逻辑有些复杂,算了,直接用mongodb做吧。   其实选择mongodb做队列的原因很简单,性能可以,在这种场景下查询起来不比mysql差。

后端的进程,一直取数据。

取到任务后,扔给后面的进程来出来。

当然仅此这样肯定是不行的,因为这样不能保证原子操作,在任务并发的时候,你还来不及删除的时候,这个任务已经又被别人搞去了 。  这个时候怎么办?  怎么解决控制原子问题。


第一个方法是文件锁的方式,findAndModify  这个函数,查询的时候,删除可以remove或者是update

第二个方法是mq派发的模式,拿出一个后端进程专门取数据,然后派发给别的线程。就这么简单。

下面是我用mongo做队列的效果,仅供参考。。。。

在线上跑了一段时间了,Mongodb的做完索引后,性能还是很不错的。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

tornado异步非堵塞方案用motor操作mongodb

tornado操作mongodb的时候,会堵塞别的访问, motor可以解决这个堵塞的问题,motor是用callback回调的方式,避免一直堵塞线程 ~  ...

阅读全文

项目中使用python mongodb遇到的问题

一开始以为pymongo不知吃objectid来获取信息,搞了好久,最后不得不放弃,在每个json里面做加了一个时间和token的key    今天和朋友聊了起来,才...

阅读全文

发表评论