【问题标题】:Need help with riak-js在 riak-js 方面需要帮助
【发布时间】:2011-04-20 03:32:33
【问题描述】:

我是 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 CPU 和 4GB RAM,带有 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 的问题,但是我在异步使用中做错了吗?

【问题讨论】:

  • 您应该尝试使用async 库同时执行Riak 查询。

标签: javascript node.js riak


【解决方案1】:

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

【讨论】:

  • 谢谢 frank06。例如,我注意到 scalaris 通过“请求列表”支持并行请求。我通过创建一个长字符串尝试了 riak-js 的弱版本:我把 s = s + String(i) + "," + String(i*i) + ";"在 for 循环中,然后对 riak 进程进行了一次保存/获取。这一下子就突破了 N=100000。
【解决方案2】:

这是我的测试文件:

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 是可行的方法,但在设置时需要格外小心。

【讨论】:

  • 感谢小册子。我对 erlang 有点了解(在我偶然发现 node 之前,我是一个热心的学生),所以我将看看 erlang 客户端 PBC。
猜你喜欢
  • 2011-01-27
  • 2014-02-06
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多