2015-09-05 51 views
2

有沒有更好的方式來運行RethinkDB節點驅動程序的並行查詢,而不是每個請求打開多個連接?或者,這實際上是一種討論我所需要的好方法嗎?我寧願遠離連接池/第三方軟件包。有問題的應用程序有一個單獨的包含RethinkDB查詢的函數。這些功能處理創建和關閉連接。這種模式允許我以最小的開銷在多個路由器中請求數據庫服務,並且不必知道每個請求。人爲的例子來解釋數據怎麼可能無關的是被質疑:RethinkDB和Node.js/Express - 爲並行查詢打開多個連接?

database.js

var r = require('rethinkdb'); 

module.exports = { 

    getApples: function(callback) { 
     r.connect(/* config */) 
      .then(function(conn){ 
       r.db('fruitDatabase').table('apples').run(conn) 
        .then(function(cursor){ 
         return cursor.toArray(); 
        }) 
        .then(function(apples){ 
         return callback(null, apples); 
        }) 
        .finally(function(){ 
         return conn.close(); 
        }); 
      }); 
    }, 
    getPotatoes: function(callback) { 
     r.connect(/* config */) 
      .then(function(conn){ 
       r.db('vegetableDatabase').table('potatoes').run(conn) 
        .then(function(cursor){ 
         return cursor.toArray(); 
        }) 
        .then(function(potatoes){ 
         return callback(null, potatoes); 
        }) 
        .finally(function(){ 
         return conn.close(); 
        }); 
      }); 
    } 
}; 

現在,我需要創建一個頁面/端點顯示所有的蘋果,所有的土豆,所以我目前通過async.parallel在我的網頁路由器同時調用這些功能:

pages.js

var pages = require('express').Router(), 
    async = require('async'), 
    db = require('./database'); 

pages.route('/food') 
    .get(function(req, res, next){ 
     async.parallel({ 
      apples: db.getApples, 
      potatoes: db.getPotatoes 
     }, function(err, data){ 
      if(err) return next(err); 

      res.render('food', 
       { 
        apples: data.apples, 
        potatoes: data.potatoes 
       }); 
     }); 
    }); 

的思考?如果它是4個並行連接(或更多)的連接呢?

回答

0

我認爲RethinkDB可以很好地處理許多並行連接。這也可能更容易處理。如果您爲所有人使用共享連接,則必須在連接中斷時重新嘗試連接,並且必須確保其在請求或服務器的生命週期中處於打開狀態。

此RethinkDB驅動程序https://github.com/neumino/rethinkdbdash在其自己的連接上運行每個查詢。

驅動程序對每個連接執行一個查詢。現在rethinkdb/rethinkdb#3296已解決,將來可能會更改此行爲。

更重要的,如果你帶來的變化進到你的應用程序,你會很可能要根據http://docs.rethinkdb.com/2.1/api/javascript/changes/

它來打開changefeeds一個好主意,改變自己的連接養活自己自己的連接。如果不這樣做,其他查詢將在同一連接上運行,而連接會阻塞更多更改,從而導致無法預測的延遲峯值。

換句話說,我說繼續,讓我們通過使用許多並行連接使它變得簡單和容易。

+0

或https:/ /github.com/hden/rethinkdb-pool – Suvitruf

+0

啊,它的確可以處理多個並行連接。我應該在我的問題中澄清說,我指的是每個請求的多個連接,而不是典型的每個請求模式或連接池。編輯問題以反映這一點。感謝您的迴應! – jfurfaro

1

如果你不能等待官方的驅動程序來獲取連接池,你也可以使用一箇中間件來打開每個請求的連接,如this example從官方文檔:

app.use(createConnection);      // Create a RethinkDB connection 

function createConnection(req, res, next) { 
    r.connect(config.rethinkdb, function(error, conn) { 
     if (error) { 
      handleError(res, error); 
     } 
     else { 
      // Save the connection in `req` 
      req._rdbConn = conn; 
      // Pass the current request to the next middleware 
      next(); 
     } 
    }); 
}