2010-10-02 68 views
1

我是一個有node.js和riak的新手,試圖使用riak-js。我寫了如下coffeescript,用整數1..N的平方來創建N個條目。該腳本適用於N = 10。如果我在db.get()中插入console.log()回調,我可以打印1..10的正方形。需要幫助riak-js

db = require('riak-js').getClient({debug:false}) 

N = 10 

for i in [1..N] 
db.save('Square', String(i), String(i*i)) 

for i in [1..N] 
db.get('Square', String(i)) 

我的問題是,當我把N = 1000大約需要10秒,我的腳本才能完成。這是正常的嗎?我期待1秒以內的事情。我的本地機器上有一個單獨的riak節點,一臺配備Ubuntu 10.04的Acer Aspire 5740,i3 CPU和4GB內存。對於只有RAM的商店,我已將storage_backend設置爲$RIAK/rel/riak/etc/app.configriak_kv_ets_backend。 riak-admin status命令確認此設置。

Q1:也許riak-js爲我的存儲桶設置一些默認的基於磁盤的後端?我如何找出/覆蓋這個?

Q2:我不認爲這是一個node.js問題,但我在異步使用中做錯了什麼?

+0

您應該嘗試使用'async'庫同時執行Riak查詢。 – ekillaby 2013-06-26 20:33:29

回答

2

A1:riak-js不使用任何隱藏設置,由您來配置您的Riak節點。

A2:你的腳本看起來很好,沒有什麼你做錯了。

事實是,我還沒有開始基準測試或認真考慮性能問題。

也就是說,每個請求都在內部排隊並連續發佈。它使API更簡單,並且不會遇到競爭條件,但它有其侷限性。理想我想圍繞打造了Riak-JS的包裝,將照顧:

  • 拿着幾個實例,使平行
  • 請求自動重新連接到集羣中的其他節點時,一個出現故障

您的示例在我的MBP上運行約5秒(使用Bitcask)。

=> time coffee test.coffee 

real 0m5.181s 
user 0m1.245s 
sys 0m0.369s 

正如概念證明,看看這個:

dbs = [require('riak-js').getClient({debug: false}), require('riak-js').getClient({debug: false})] 

N = 1000 

for i in [1..N] 
    db = dbs[i % 2] 
    db.save('sq', String(i), String(i*i)) 

for i in [1..N] 
    db = dbs[i % 2] 
    db.get('sq', String(i)) 

結果:

=> time coffee test.coffee 

real 0m3.341s 
user 0m1.133s 
sys 0m0.319s 

這將提高通過使用更多的客戶擊中DB。

否則答案是Protocol Buffers接口,毫無疑問。我無法用你的例子讓它運行,所以我必須深入研究它。但那應該是閃電般的。

確保您正在運行最新的Riak(已經有很多性能改進)。還要考慮到CoffeeScript編譯的一些開銷。

+0

謝謝frank06。例如,我注意到scalaris通過「請求列表」支持並行請求。我通過創建一個長字符串來嘗試使用riak-js的弱版本:我把s = s + String(i)+「,」+ String(i * i)+「;」在一個for循環中,然後做了一次保存/進入riak進程。這一嘎吱嘎吱通過N = 100000在閃光。 – user402476 2010-10-04 16:34:37

0

這裏是我的測試文件:

db = require('../lib').getClient({debug:false}) 

N = if process.argv[2] then process.argv[2] else 10 

for i in [1..N] 
db.save('Square', String(i), String(i*i)) 

for i in [1..N] 
db.get('Square', String(i)) 

編譯之後,我得到以下時間:

$ time node test1.js 1000 

real 0m3.759s 
user 0m0.823s 
sys 0m0.421s 

運行後多次迭代,我的時間是在該卷不管後端的相似。我測試了ets和dets。 os會在第一次運行時緩存磁盤塊,但後續運行速度會更快。

繼續關於frank06的回答,我還會研究連接處理。這對Riak來說不是問題,因爲它是riak-js如何建立聯繫的問題。另外請注意,在Riak中,所有節點都是相同的,所以如果您有三節點羣集,您可以創建與所有三個節點的連接並以某種方式循環循環它們。 Protobuf api是要走的路,但需要特別注意設置。

+0

謝謝siculars。我知道一些erlang(我是一個敏銳的學生,直到我偶然發現節點),所以我會看看erlang客戶端PBC。 – user402476 2010-10-04 16:41:40