Помощь в архитектуре репликации при использовании ArangoDB

В моем стремлении решить тысячи клиентов, каждый из которых имеет отдельную базу данных ArangoDB, записывать индивидуальную информацию по мере того, как что-то работает ... Нам нужно собрать эту информацию обратно в коллекцию на отдельном сервере Master Node, чтобы по ней можно было делать запросы и отчеты. Изучение возможностей JavaScript и действий в ArangoDB… Возможно ли это и достаточно ли быстро, чтобы «реплицировать» данные обратно на главный узел?

1) Данные локального запуска регистрируются на каждом клиенте.

2) Выполняется триггер действия (давайте сначала возьмем сценарий дерьма, без массовой загрузки или чего-то еще) ... для каждой вставки возьмите локально вставленные данные и сделайте этот точный запрос на главный узел для вставки в общую коллекцию (документ данные, хранящиеся на каждом клиенте, имеют свойства, которые однозначно идентифицируют его и т. д.).

3) Это эффективно «реплицирует» / объединяет уникальные данные каждого клиента в единую коллекцию главного узла.

Мысли?

Спасибо,

Кен


person user3521286    schedule 10.04.2014    source источник


Ответы (1)


Первоначальная мысль об этом:

Вы можете обернуть операции вставки / обновления / удаления в определенную коллекцию (коллекции) в собственном API. Вместо использования обычных маршрутов HTTP POST, PUT / PATCH, DELETE, которые ArangoDB предоставляет для документов, вы можете писать свои собственные маршруты внутри ArangoDB. Для этого у ArangoDB есть фреймворк Foxx.

Например, вы можете создать свой собственный маршрут вставки. Внутри маршрута вы можете выполнить любой код JavaScript. Например, вот простая оболочка вставки, которая по ширине вставляет данные в коллекцию mydata:

controller.post('/my-insert', function (req, res) {
  var document = req.body();

  try {
    var result = db.mydata.save(doc);
    // TODO: send off data to external server etc.

    res.json(result); // send back result to original client
  }
  catch (err) {
    // TODO: handle and report error
  }
});

В приведенном выше примере данные хранятся в локальной коллекции, а ответ отправляется обратно клиенту. Однако вы можете выполнить дополнительный код JavaScript после операции сохранения. Таким образом, вы можете отправлять данные на другой сервер оттуда.

Вы можете сделать то же самое для обновления и удаления маршрутов. Это решение требует, чтобы все ваши операции использовали настраиваемые маршруты, и вы не изменяете данные с помощью обычных API-интерфейсов документов. Использование обычных API-интерфейсов, конечно, по-прежнему будет работать, но не приведет к срабатыванию настраиваемых действий.

Интересные вопросы заключаются в том, можете ли вы принять блокировку потока при «отправке на другой серверный вызов» и что вы будете делать, если отправка данных на другой сервер не удалась по какой-либо причине.

person stj    schedule 11.04.2014
comment
Вероятно, хорошей идеей будет вставка данных не только в фактическую коллекцию (например, mydata), но и вставку дополнительного документа в отдельную коллекцию изменений, которые будут отправлены на центральный узел. Это позволяет потоку продолжать работу и не блокировать отправку данных центральному узлу. Репликация на центральный узел может выполняться асинхронно, вне контекста запроса. Такой подход также сделал бы его более надежным, поскольку он не полагается на рабочее соединение с центральным узлом. Если соединение с центральным узлом не может быть установлено, асинхронная инкрементная репликация может повториться позже. - person stj; 11.04.2014
comment
Я подготовил возможную инкрементную репликацию на центральный узел для конкретных данных здесь: gist.github.com/jsteemann/ 10453106 - person stj; 11.04.2014
comment
собрать небольшой пример приложения Foxx: github.com/jsteemann/data-forwarding-example - person stj; 14.04.2014