mongo实现消息队列

使用mongo来构建一个简单的消息队列

MongoDB 有一个叫 Tailable Cursors的特性,它相似于tail -f 命令,你在一个Capped Collection上面执行查询操做,当操做完成后,你能够不关闭返回的数据Cursor,并持续地从中读出新加入的数据。node

这个特性能够用来干什么?我以为最直接的一个用途就是用做消息队列了,利用此特性加上MongoDB 自然的Replication 机制,作一个分布式的队列系统貌似不是什么难事。linux

Capped collections

Capped collections 就是固定大小的collection。 它有很高的性能以及队列过时的特性(过时按照插入的顺序)。 有点和 "RRD" 概念相似。git

What RRDtool does?github

RRDtool is the OpenSource industry standard, high performance data logging and graphing system for time series data.mongodb

Tailable Cursor

  • 一般, mongoDB在遍历完全部结果集中的数据后,会自动关闭游标。
  • 可是, 对于Capped collections, 在遍历完全部数据后,游标一直保持打开状态。当客户端再次向Capped collections插入数据时,Tailable Cursor将继续获得数据。

**注:**Tailable Cursor在概念上,相似于Unix的tail命令的-f选项,即一种‘follow’模式。数据库

建立步骤

  1. 建立一个 Capped Collection编程

    db.createCollection("mycoll", {capped:true, size:100000})缓存

    和标准的collection不一样,你必需要显式的建立一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提早分配的。 要注意的是指定的存储大小包含了数据库的头信息。app

    • 特性
      • 若是空间都被使用完毕,新添加的对象会取代最旧的那个数据。
      • 若是你执行find(),并无指定顺序。返回的结果就是按照插入顺序排序。
      • 倒序使用 find().sort({$natural:-1})。
    • 应用
      • 日志Logging.分布式

        • Capped collection性能很是优秀,能够来存储日志文档。
        • 插入一个没有索引的capped collection速度很是接近存储在文件系统。 - 因为使用了内置的LRU机制,也不用担忧超出硬盘空间。
      • 缓存Caching.

        • 若是你但愿在数据库缓存一些小数量的对象。capped collection提供了很是方便的机制来实现这个操做。
        • 注意的是要给capped table添加索引,由于这种应用,读频率高于写。
      • 自动存档Auto Archiving.

        • 若是你但愿数据自动过时。capped collection要比手写cron scripts更为方便。
    • 建议
      • 默认的状况下,capped collection不会在_id添加索引。
      • 为了最大化性能,不要再capped collection上建立索引。
      • 若是这个collection写操做多于读操做,更不须要索引了。
      • 注意的是,你可能建立了索引。速度就会下降,可是仍是要比标准的collection要快。
      • 使用 natural ordering 来更有效的获取最近插入的元素。和linux的tail命令类似。
    • 限制对象的个数 db.createCollection("mycoll", {capped:true, size:100000, max:100}); 提示: 当编程的时候,存储最近对象的版本号的方法就是把max参数设为1(max=1)。
    • 使用validate()工具来查看collection使用的存储空间 db.mycoll.validate();
    • 查看一个collection是否为capped collection 能够调用isCapped方法来查看一个collection是否为capped collection。 db.foo.isCapped()
  2. 使用tailable cursors

    示例: oplog

    注:

    • tailable cursors不使用索引
    • 返回文档顺序为硬盘中存储的顺序
    • 由于不用索引,初始查询代价高;新增文档代价低;
    • 游标在如下几种状况会死掉或不可用:
      • 没有返回
      • 返回的文档在集合末尾,而且应用删除了文档
    • 死掉的游标ID为0。
var filter = {};

	// set MongoDB cursor options
	var cursorOptions = {
	  tailable: true,
	  awaitdata: true,
	  numberOfRetries: -1
	};

	// create stream and listen
	var stream = coll.find(filter, cursorOptions).sort({$natural: -1}).stream();
        
	// call the callback
	stream.on('data', function(document) {
	  console.log(document);
	});

mubsub

项目地址: https://github.com/scttnlsn/mubsub

mubsub基于node.js和mongoDB实现发布,订阅消息。

使用mongo的capped collections和tailable cursors,当插入指定文档时,通知订阅者。

相关文章
相关标签/搜索