Нужна помощь с riak-js - PullRequest
       14

Нужна помощь с riak-js

1 голос
/ 02 октября 2010

Я новичок с node.js и riak, пытаюсь использовать riak-js .Я написал следующее coffeescript , чтобы создать N записей с квадратами целых чисел 1..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 и 4 ГБ оперативной памяти, с Ubuntu 10.04.Для магазина только для оперативной памяти я установил storage_backend в $RIAK/rel/riak/etc/app.config на riak_kv_ets_backend.Команда состояния riak-admin подтверждает эту настройку.

Q1: Возможно, riak-js устанавливает дисковый бэкэнд по умолчанию для моего сегмента?Как мне узнать / переопределить это?

Q2: Я не думаю, что это проблема node.js, но я делаю что-то не так в асинхронном использовании?

Ответы [ 2 ]

2 голосов
/ 04 октября 2010

A1: riak-js не использует никаких скрытых настроек, вам решать, как настроить узлы Riak.

A2: Ваш сценарий выглядит нормально, вы ничего не делаете неправильно.

Правда в том, что я еще не начал бенчмаркинг или всерьез рассматривал проблемы с производительностью.

Тем не менее, каждый запрос помещается в очередь внутри и отправляется последовательно. Это упрощает API, и вы не сталкиваетесь с условиями гонки, но у него есть свои ограничения. В идеале я хочу создать оболочку вокруг riak-js, которая позаботится о:

  • Удерживание нескольких экземпляров для параллельного выполнения запросов
  • Автоматическое переподключение к другим узлам в кластере при выходе из строя

Ваш пример выполняется за ~ 5 секунд на моем MBP (с использованием 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.

0 голосов
/ 04 октября 2010

Вот мой тестовый файл:

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 - это то, что нужно, но требует особой осторожности при настройке.

...