我是一个使用node.js和riak的新手,正在尝试使用riak-js。我写了下面的coffeescript,用整数1..N的平方创建N个条目。这个脚本适用于N=10,如果我在db.get()中放入一个console.log()回调,我就可以打印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处理器和4 4GB内存,Ubuntu10.04。对于只有内存的存储,我将$RIAK/rel/riak/etc/app.config中的storage_backend设置为riak_kv_ets_backend。riak-admin status命令可确认此设置。
Q1:也许riak-js正在为我的存储桶设置一些默认的基于磁盘的后端?我如何找出/覆盖它?
Q2:我不认为这是node.js的问题,但是我是不是在异步使用方面做错了什么?
发布于 2010-10-04 16:30:16
A1: riak-js不使用任何隐藏设置,您可以自行配置Riak节点。
A2:你的脚本看起来很好,你没有做错什么。
事实是,我还没有开始进行基准测试,也没有认真考虑性能问题。
也就是说,每个请求都在内部排队,并按顺序发出。它使API变得更简单,并且不会遇到竞争条件,但它也有其局限性。理想情况下,我想围绕riak-js构建一个包装器,它将处理以下内容:
持有多个实例以在parallel
您的示例在我的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这将通过使用更多的客户端访问数据库来改善。
否则,答案是Protocol Buffers接口,这一点毫无疑问。我不能用你的例子运行它,所以我必须深入研究它。但这应该是闪电般的速度。
确保您运行的是最新的Riak (已经有了很多性能改进)。还要考虑到CoffeeScript编译的一些开销。
发布于 2010-10-04 17:09:33
下面是我的测试文件:
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。操作系统将在第一次运行时在特定卷上缓存您的磁盘块,但后续运行速度会更快。
在frank06 06的回答之后,我还将研究连接处理。这不是Riak的问题,而是riak-js如何建立连接的问题。还要注意,在Riak中,所有节点都是相同的,因此如果您有一个三节点集群,您将创建到所有三个节点的连接,并以某种方式轮询它们。Protobuf api是可行的方法,但在设置时需要格外小心。
https://stackoverflow.com/questions/3844303
复制相似问题