Rethinkdb竞争条件创建表

时间:2016-07-06 13:47:37

标签: node.js docker rethinkdb

我在nodejs中写了一个使用rethinkdb的add。在启动时,应用程序会执行大量数据库设置,包括创建必要的表(如果它们不存在)。代码(简化)看起来像:

  r.tableList().run(conn).then(existingTables => 
    requiredTables
      .filter(t => existingTables.indexOf(t) === -1)
      .map(name => r.tableCreate(name).run(conn)));

这很好用。问题是应用程序在docker容器内运行,我需要能够使用docker-compose scale app=3进行扩展。当部署作业运行时,会立即创建三个新容器,每个容器都会创建一组表,导致我需要手动解决的数据库问题。我想我能理解为什么会这样,但我无法理解如何解决它。我曾想过尝试在一个查询中编写它,但真正的用途是相当复杂(即创建索引,运行迁移,填充样本数据),我不认为有任何方法我可以在一个查询中做很多事。

1 个答案:

答案 0 :(得分:0)

RethinkDB目前不保证管理操作是原子的。最好的办法可能是分离管理操作(创建数据库,表和索引),然后在仅在一个容器中运行的单独设置步骤中运行它们。