2016-07-06 14 views
1

rethinkdbを使用するnodejsで書かれた追加があります。起動時に、アプリケーションが存在しない場合に必要なテーブルを作成するなど、データベース設定の束を行います。コードは次のようになります。Rethinkdb競合条件テーブルの作成

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

これは問題なく動作します。問題は、アプリケーションがドッカーコンテナ内で実行されていることです。たとえば、docker-compose scale app=3を使用してスケールアウトできる必要があります。デプロイメントジョブでこれを実行すると、直ちに3つの新しいコンテナが作成され、それぞれが一連のテーブルを作成し、手動で解決する必要のあるデータベースの問題が発生します。なぜこのようなことが起こるのか理解できますが、解決方法はわかりません。私はそれをすべて単一のクエリで書くことを考えていましたが、実際の使用はかなり複雑です(つまり、インデックスを作成し、移行を実行し、サンプルデータを取り込みます)、私は何かできる方法がないと思います1つのクエリ内のロット

答えて

0

RethinkDBは現在、管理操作がアトミックであることを保証しません。管理作業(データベース、テーブル、およびインデックスの作成)を分離し、1つのコンテナで実行される個別のセットアップ手順で実行するのが最善の方法です。

+0

はい、私はそれについて考えていましたが、実際には別のサービスを作成したくはありません。また、主アプリコンテナを起動する前にdbアクションが実行されるのを待つ必要があるため、ブートストラップが難しくなります。ドッカーの作成にはそのような連鎖のサポートがないので手動でスクリプトを作成する必要があります。 – aquavitae

+0

おそらく、アプリケーションコンテナは準備が整うまで、起動するのを待つのではなく、準備が整うまで待機します。 (また、別のサービスを作成したくない場合は、競合するdb /テーブル名を解決するためにアプリケーションサービスをスマートにすることもできます。たとえば、競合が発生した場合にUUIDが最も高いものを常に削除する'rethinkdb'データベース内の関連するシステムテーブルを見れば分かります)。 – mlucy