我想知道哪是最好的方法来做这个与ArangoDB,我开始使用事务,或更新它的记录使用修订检查,但它不是很好与许多并发更新。
在新版本2.1中,我看到我可以在服务器中注册函数以执行每X次时间,因为我保存了很长一段时间的原始数据,我可以使用一个服务器任务异步计数,但它会给计数器带来更多延迟。
还有别的方法吗?
谢谢,迭戈Guraieb
目前至少有三种增加计数器的方法:
- 让客户端获取获取计数器的值,增加它并将更新后的文档发送回服务器。更新时,检查文档的etag/revision id是否有并发更新,如果是,则重复
- 创建执行更新的服务器端事务。一个例子(不使用计数器,但列表修改可以在这里找到:https://groups.google.com/forum/#!topic/arangodb/2t9RV4eYUi4)
- 分别保存每个计数器修改操作(例如{"op":"inc","value":1}),并使用服务器端任务定期计算当前计数器。如果需要,这个替代方案3也可以以增量方式实现。
选项1将需要至少2次HTTP调用(fetch + update),并且您将需要对并发更新的情况进行错误处理。所以它不是很有用。
从客户的角度来看,我认为备选方案2是最容易使用的。它允许通过REST API公开"增加计数器"操作,并且可以在原子事务中实现获取和更新。
选项3也可以,如果你可以承受你的计数器稍微过时。当实现时,它应该增量地实现,例如,通过为计数器保留一个总数,并在每次更新任务执行时只添加新值。否则,你的"反操作"集合将无限增长,更新将变得越来越慢。备选方案#3还有一个优点,即您可以保留最近操作的(小)日志,例如用于审计。