使用ArangoDB时的复制体系结构帮助

使用ArangoDB时的复制体系结构帮助,arangodb,Arangodb,在我寻求解决1000个客户端的问题时,每个客户端都有单独的ArangoDB,在某些东西运行时记录单独的信息……我们需要将这些信息聚合回单个主节点服务器中的集合,以便对其进行查询和报告。查看ArangoDB中JavaScript和操作的强大功能……这是否有可能且足够快地将数据“复制”回主节点 1) 正在每个客户端上记录本地运行数据 2) 执行一个动作触发器(让我们先来看看神圣的垃圾场景,没有批量上传或任何东西)…对于每次插入,获取本地插入的数据,并向主节点发出准确的请求,以便插入到公共集合中(存储

在我寻求解决1000个客户端的问题时,每个客户端都有单独的ArangoDB,在某些东西运行时记录单独的信息……我们需要将这些信息聚合回单个主节点服务器中的集合,以便对其进行查询和报告。查看ArangoDB中JavaScript和操作的强大功能……这是否有可能且足够快地将数据“复制”回主节点

1) 正在每个客户端上记录本地运行数据

2) 执行一个动作触发器(让我们先来看看神圣的垃圾场景,没有批量上传或任何东西)…对于每次插入,获取本地插入的数据,并向主节点发出准确的请求,以便插入到公共集合中(存储在每个客户机上的文档数据具有唯一标识它的属性等)

3) 这将有效地将每个客户端的唯一数据“复制”或聚合到单个主节点集合

想法

谢谢


对此的初步思考:

您可以将插入/更新/删除操作包装到自己的API中的特定集合。您可以在ArangoDB中编写自己的路由,而不是使用ArangoDB为文档提供的常规HTTP POST、PUT/PATCH、DELETE路由。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仍然可以工作,但不会触发自定义操作


有趣的问题是,您是否可以接受“发送到另一个服务器调用”上的线程阻塞,以及如果将数据发送到另一个服务器由于任何原因失败,您会怎么做。

一个好主意可能是不仅将数据插入到实际的集合中(例如mydata),而且将额外的文档插入到单独的数据库中“要发送到中心节点的更改“收藏。这允许线程继续,而不是阻止向中心节点发送数据。到中心节点的复制可以在请求上下文之外异步完成。这种方法还将使其更加健壮,因为它不依赖与中心节点的工作连接。如果无法建立到中心节点的连接,则可以稍后重试异步增量复制。我起草了到中心节点的最终增量复制以获取特定数据,如下所示:组合一个小示例Foxx应用程序: