我是node.js和riak的新手,尝试使用riak-js。我写了以下coffeescript,用正整数1..N的正方形创建N个条目。该脚本适用于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秒内完成任务。我的本地机器上有一个riak节点,一台Acer Aspire 5740,i3 CPU和4GB内存,带有Ubuntu 10.04。对于仅限RAM的商店,我已将storage_backend
中的$RIAK/rel/riak/etc/app.config
设置为riak_kv_ets_backend
。 riak-admin status命令确认此设置。
Q1:也许riak-js为我的存储桶设置了一些默认的基于磁盘的后端?我如何找出/覆盖它?
Q2:我不认为这是一个node.js问题,但是我在异步使用中做错了吗?
答案 0 :(得分: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
通过使用更多客户端访问数据库,这将得到改善。
否则答案是Protocol Buffers接口,毫无疑问。我无法用你的例子运行它所以我将不得不深入研究它。但那应该是闪电般快速的。
确保您正在运行最新的Riak(已经有很多性能改进)。还要考虑CoffeeScript编译的一些开销。
答案 1 :(得分: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。操作系统将在特定卷的第一次运行时缓存磁盘块,但后续运行速度更快。
继续frank06的回答,我也会研究连接处理。这对Riak来说不是问题,因为这是riak-js如何建立连接的问题。另请注意,在Riak中,所有节点都是相同的,因此如果您有一个三节点集群,您将创建与所有三个节点的连接,并以某种方式循环它们。 Protobuf api是可行的方式,但在设置时需要额外注意。