+
80
-

mongodb有没有消息队列?

mongodb有没有消息队列?mongodb怎么实现一个消息队列,消息订阅发布

网友回复

+
0
-

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

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

Capped collections

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

Tailable Cursor

通常, mongoDB在遍历完所有结果集中的数据后,会自动关闭游标。

但是, 对于Capped collections, 在遍历完所有数据后,游标一直保持打开状态。当客户端再次向Capped collections插入数据时,Tailable Cursor将继续得到数据。

Tailable Cursor在概念上,类似于Unix的tail命令的-f选项,即一种‘follow’模式。

创建步骤

创建一个 Capped Collection db.createCollection("mycoll", {capped:true, size:100000}) 和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。 要注意的是指定的存储大小包含了数据库的头信息。

特性

如果空间都被使用完毕,新添加的对象会取代最旧的那个数据。

如果你执行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();

档时,通知订阅者。
我知道答案,我要回答