2016-07-06 3 views
1

У меня есть добавление, написанное в nodejs, которое использует rethinkdb. Во время запуска приложение выполняет набор настроек базы данных, включая создание необходимых таблиц, если они не существуют. Код (упрощенный) выглядит примерно так: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. Когда задание развертывания выполняется, сразу создаются три новых контейнера, каждый из которых создает набор таблиц, в результате чего возникают проблемы с базой данных, которые мне нужно разрешить вручную. Я думаю, я могу понять, почему это происходит, но я не вижу, как это решить. Я думал о попытке написать все это в одном запросе, но реальное использование довольно сложное (т. Е. Создает индексы, запускает миграции, заполняет выборочные данные), и я не думаю, что я могу это сделать лот в одном запросе.

ответ

0

RethinkDB в настоящее время не гарантирует, что административные действия являются атомарными. Лучше всего было бы отделить административные действия (создание баз данных, таблиц и индексов) и запустить их на отдельном шаге настройки, который запускается только в одном контейнере.

+0

Да, я подумал об этом, но я действительно не хочу создавать отдельную услугу только для этого. Кроме того, самонастраивание стало бы сложным, так как мне нужно было дождаться выполнения действий db перед запуском основных контейнеров приложений - насколько я знаю, docker-compose не поддерживает эту цепочку, поэтому мне нужно будет ее скриптировать вручную. – aquavitae

+0

Возможно, у вас могут быть контейнеры приложений, ожидающие готовности db, а не ожидающие их запуска, пока они не будут готовы. (Кроме того, если вы не хотите создавать отдельную услугу, другой вариант заключается в том, чтобы сделать ваши приложения достаточно умными, чтобы разрешать конфликтующие имена db/table, например, если они всегда удаляют те, у которых самые высокие UUID, когда есть конфликт Вы можете сделать это, посмотрев соответствующую системную таблицу в базе данных 'rethinkdb'.) – mlucy

Смежные вопросы