2014-11-24 5 views
5

Хорошо, поэтому у меня есть приложение Spring, которое принимает сетевое представление и загружает виртуальные машины для представления переданной сети.Каков наилучший способ «откат» изменений?

Он использует API низкого уровня для вызова виртуальных машин, нет базы данных участвует.

Что мне нужно, чтобы выяснить, как это сделать, это обработать ситуацию, когда пользователь отправляет сетевую модель узла (или любого номера) 10, и приложение проходит и создает сеть (запуск виртуальных машин), если узел не работает для запуска я хочу быть в состоянии реагировать на это. Я хотел бы иметь возможность отменить мои изменения (т. Е. Уничтожить все созданные узлы).

Мне сказали, что мне нужно заглянуть в «Транзакции», но я не уверен, относится ли это к этому сценарию, когда я не использую базу данных.

В качестве побочного примечания у меня есть логика для удаления узлов, если пользователь отправляет в этом запросе.

Мой вопрос: как я могу справиться с этим?

Кроме того, это лучший переполнение стека для этого вопроса?

+0

есть только один стек * Переполнение *, и да, это похоже на соответствующий Stack * Exchenge * для этого вопроса :) Кстати, это хороший вариант. Моим инстинктом было бы использовать существующую структуру Transaction, а потому, поскольку, как вы намекаете, она предназначена для того, чтобы делать именно то, о чем вы говорите, но в отношении операций с базой данных. Я подозреваю, что вы можете приспособить его, чтобы он работал для вас здесь. – drewmoore

+1

Возможно, [Computer Science StackExchange] (http://cs.stackexchange.com/) - лучший выбор. – hfontanez

+0

Упс! Мои извинения, я имел в виду «StackExchange» :) – envinyater

ответ

4

Кажется, что вы ищете транзакционное поведение и, в частности, для атомарности («все или ничего»). Но обычно «транзакция» означает определенные гарантии (особенно в отношении свойств ACID), которые будут трудными или невозможными для достижения, когда задействуются временные рамки уровня человека на порядок минут.

Возможно, «рабочий процесс с компенсацией ошибок» - это больше того, что вы искали бы здесь.

Я бы выполнил это вручную, возможно, с помощью инструмента поддержки (например, рабочих процессов). Отключите процесс создания вашей сети и отслеживайте текущий прогресс, такой как созданные виртуальные машины, выполняемые виртуальные машины и т. Д. Если есть ошибки, требующие откат, выполните другой процесс, который выполняет очистку. Поведение самого процесса очистки может потерпеть неудачу, поэтому он может повторить свои различные шаги пару раз, прежде чем генерировать отчет, в котором говорится, что «этот шаг очистки не прошел».

Если задействованы общие ресурсы, вам также понадобится реализовать какой-то механизм изоляции. Иногда это достаточно просто - например, DHCP помогает избежать дублирования IP-адресов. Если вы обновляете файл зоны DNS, вам нужно синхронизировать доступ к нему, чтобы избежать одновременной записи. И т. Д.

+0

Я думаю, что согласен с тобой, Вилли Уилер. – hfontanez