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,當插入指定文檔時,通知訂閱者。

相關文章
相關標籤/搜索