需要帮助riak-js

我是一个有node.js和riak的新手,试图使用riak-js 。 我写了下面的coffeescript ,用整数1..N的正方形创buildN个条目。 该脚本正常工作N = 10。 如果我把一个console.log()callbackdb.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秒以内。 我的本地机器上有一个单独的riak节点,一个是Acer Aspire 5740,I3 CPU和4GB内存,带有Ubuntu 10.04。 对于只有RAM的存储,我已经将$RIAK/rel/riak/etc/app.config storage_backend设置为riak_kv_ets_backend 。 riak-admin status命令确认这个设置。

Q1:也许riak-js为我的桶设置一些默认的基于磁盘的后端? 我如何找出/覆盖这个?

Q2:我不认为这是一个node.js问题,但我在asynchronous使用中做错了什么?

A1:riak-js不使用任何隐藏设置,由您来configuration您的Riak节点。

A2:你的脚本看起来很好,没有什么你做错了。

事实是,我还没有开始进行基准testing或认真考虑性能问题。

也就是说,每个请求都在内部排队并连续发布。 它使得API更简单,并且不会遇到竞争条件,但是它有其局限性。 理想情况下,我想build立一个围绕riak-js的包装,将照顾:

  • 持有多个实例并行发出请求
  • 一旦发生故障,自动重新连接到集群中的其他节点

你的例子在我的MBP上运行~5秒(使用Bitcask)。

  => time coffee test.coffee real 0m5.181s user 0m1.245s sys 0m0.369s 

就像一个概念的certificate,看看这个:

 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 

这将通过使用更多的客户端击中数据库来改善。

否则,答案就是Protocol Buffers接口,毫无疑问。 我不能用你的例子来运行它,所以我不得不深入研究它。 但是,这应该是闪电般的。

确保你运行的是最新的Riak(有很多性能改进)。 还要考虑到CoffeeScript编译的一些开销。

这是我的testing文件:

 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 

运行多次迭代后,无论后端如何,我的时间都是相似的。 我testing了ets和dets。 操作系统会caching您的磁盘块在第一次运行在一个特定的音量,但后续运行速度更快。

在frank06的回答之后,我还会研究连接处理。 这对Riak来说不是问题,因为它是ri-js如何build立联系的问题。 还要注意在Riak中,所有节点都是相同的,所以如果你有一个三节点的集群,你可以创build到所有三个节点的连接,并以某种方式循环。 Protobuf API是要走的路,但需要一些额外的照顾设置。