1

私は node.js と riak の初心者で、riak-jsを使用しようとしています。整数 1..N の 2 乗で N 個のエントリを作成するために、次のcoffeescriptを作成しました。スクリプトは N=10 で正常に動作します。console.log()コールバックを入れるとdb.get()、1..10 の二乗を出力できます。

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秒をはるかに下回るものを期待していました。Ubuntu 10.04 を搭載したローカル マシン、Acer Aspire 5740、i3 CPU、4GB RAM に単一の riak ノードがあります。RAM のみのストアの場合、 に設定storage_backend$RIAK/rel/riak/etc/app.configましたriak_kv_ets_backend。riak-admin status コマンドは、この設定を確認します。

Q1: おそらく riak-js は私のバケットにデフォルトのディスクベースのバックエンドを設定していますか? これを見つけて上書きするにはどうすればよいですか?

Q2: node.js の問題ではないと思いますが、非同期の使い方で何か間違っているのでしょうか?

4

2 に答える 2

2

A1:riak-jsは非表示の設定を使用しません。Riakノードを構成するのはあなた次第です。

A2:スクリプトは問題ないようですが、間違っていることは何もありません。

真実は、私はベンチマークを開始したり、パフォーマンスの問題を真剣に検討したりしていないということです。

とはいえ、すべてのリクエストは内部でキューに入れられ、シリアルに発行されます。APIがシンプルになり、競合状態に陥ることはありませんが、制限があります。理想的には、次の処理を行うriak-jsのラッパーを作成したいと思います。

  • 複数のインスタンスを保持して並行してリクエストを行う
  • 1つがダウンしたときに、クラスター内の他のノードに自動的に再接続します

あなたの例は私の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にアクセスするクライアントを増やすことで改善されます。

それ以外の場合、答えはプロトコルバッファインターフェイスです。間違いありません。私はあなたの例でそれを実行させることができなかったので、私はそれを掘り下げる必要があります。しかし、それは非常に速いはずです。

最新のRiakを実行していることを確認してください(パフォーマンスが大幅に向上しています)。また、CoffeeScriptコンパイルのオーバーヘッドも考慮に入れてください。

于 2010-10-04T08:30:16.243 に答える
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 ではすべてのノードが同じであるため、3 つのノード クラスタがある場合は、3 つのノードすべてへの接続を作成し、それらを何らかの方法でラウンド ロビンすることにも注意してください。Protobuf api が最適ですが、セットアップには特別な注意が必要です。

于 2010-10-04T09:09:33.247 に答える