客户端生成的文档序列与Node.js

时间:2017-06-19 23:11:02

标签: javascript node.js mongodb architecture

我们希望构建一个Node.js API,在MongoDB集合中存储无架构文档。每个文件都应该有一个密钥" no"它按顺序命令它们:

[
   { "no": 1, ... }, 
   { "no": 2, ... }, 
   { "no": 3, ... }, 
   { "no": 4, ... }, 
   ...
]

我们有以下限制:

  • 排序(包括其他参数)需要加密签名。因此,服务器无法在签名和发送数据之前设置客户端不知道的序列号。
  • no必须是唯一的(不允许:1 - > 1 - > 2 - > 3)
  • 测序中一定不能有任何空白(不允许:1 - > 2 - > 4 - > 5)
  • API被复制,因此会有很多针对MongoDB的并发请求。
  • API客户端不是浏览器应用程序,它实际上也是Node.js应用程序。 只有一个API客户端

我们的出发点是拥有一个API,在每个存储请求中返回下一个序列号。

POST /collection { "no": 1, ...}
returns {"next": 2}

这会有用吗?

在客户端,它可能类似于这个伪代码:

let next

module.exports.create = (document, cb) => {
   if (!next) next = 1 // here it is probably better to sync the initial no with the db instead always starting with 1
   document.no = next
   return post('/collection', document, (err, res) => {
       if (err) ...
       next = res.next
       return cb(...)
   }
}

如果许多并发呼叫者调用了客户端create,是否会出现两个或多个创建请求重复no的情况?

1 个答案:

答案 0 :(得分:0)

如果您有并发API调用并且客户端有权确定顺序,那么如果客户拥有确定权限的全部权限,那么您几乎不可能实现您的尝试。序列

但是,如果序列没有之间没有任何差距且必须是顺序的,为什么客户端必须是提供序列no 的客户端?您可以轻松地同意排序模式(例如1,2,3,4或AB1,AB2,AB3等),并让服务器端插入序列号,具体取决于哪个请求来在第一。使用findAndModify创建一个生成运行编号的集合,然后让服务器将序列no更新到数据库中。