1

我是 node.js 和 riak 的新手,正在尝试使用riak-js。我写了下面的咖啡脚本,用整数 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 RAM,Ubuntu 10.04。对于仅限 RAM 的商店,我已设置storage_backend为. riak-admin status 命令确认此设置。$RIAK/rel/riak/etc/app.configriak_kv_ets_backend

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

Q2:我觉得不是node.js的问题,是不是我在异步使用中做错了什么?

4

2 回答 2

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 编译的一些开销。

于 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。操作系统将在第一次运行时以特定卷缓存您的磁盘块,但后续运行速度更快。

跟进 frank06 的回答,我还将研究连接处理。这不是 Riak 的问题,而是 riak-js 如何设置它的连接的问题。另请注意,在 Riak 中,所有节点都是相同的,因此如果您有一个三节点集群,您将创建到所有三个节点的连接并以某种方式循环它们。Protobuf api 是可行的方法,但在设置时需要格外小心。

于 2010-10-04T09:09:33.247 回答