Модификация и методология отката для набора объектов и их состояния - PullRequest
2 голосов
/ 14 июня 2011

В системе, которую я пишу, у меня есть концепция объектов пакета и сервиса.

Package Service Relationship

Пакет - это контейнер для набора сервисов, который имеет встроеннуюмножество настраиваемых ограничений.Эти ограничения включают в себя:

  • Какие типы служб поддерживаются
  • Количество служб, которые могут быть выделены для пакета
  • Свойства, которые необходимо установить наконкретные значения в указанных службах

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

Это необходимо сделать до того, как будут приняты какие-либо деньги, чтобы гарантировать, что определенные уникальныересурсы распределяются между службами (и ограждаются).

Проблема возникает в случае сбоя платежа и отмены обновления. Как откатить изменения и вернуться в предыдущее состояние?

Может возникнуть следующий (не исчерпывающий) список проблем:

  • При удалении служб, которые больше не совместимы с новым пакетом, могут быть освобождены уникальные ограничения, которые затем используютсядругими пакетами (в других учетных записях и т. д.) остановка отката невозможна
  • Службы, которые удаляются, трудно восстановить с неповрежденными ссылками
  • Если службы не удалены, они продолжают использовать уникальные ограничениякоторые, возможно, понадобятся другим аналогичным службам

В настоящее время это выполняется с помощью набора шагов, специфичных для пакета, которые хранят объекты вне пути (а не удаляют их),и удерживайте список шагов для восстановления состояния в случае отката.Тем не менее, это делается для каждого конкретного случая, подвержено ошибкам и чувствует себя неуклюже.

Мне было интересно, сталкивался ли кто-нибудь из вас с чем-либо подобным и знал ли он образец или методологию, которую можно использовать здесь.По сути, мы должны иметь возможность обновлять состояние набора объектов, фиксировать изменения, но иметь возможность отката к предыдущей версии.NB. Внутри системы состояние объектов может быть сериализовано и сохранено.

Любое "Я бы так не делал!"комментарии с благодарностью получены с альтернативами.

Вот пример:

До обновления:

Package configuration before upgrade

После обновления:

Package configuration after upgrade

1 Ответ

1 голос
/ 14 июня 2011

Сделано что-то похожее, но очень быстро.

Чтобы выполнить «отмену» / «откат», вам необходимо выполнить несколько действий:

[1] Для сохранения / регистрации / сериализации значения заданных объектов («Пакет» и «Сервис») перед выполнением операции.

Если операция прошла успешно, эта информация может быть удалена или просто сохранена как исторические данные. В противном случае используйте его для возврата объектов в предыдущее состояние.

Вы также можете зарегистрировать новые изменения.

[2] Вы должны зарегистрировать меню или набор операций, которые могут быть выполнены вашим приложением, и в конечном итоге откат.

+----------------+            +------------------+
|................|            |..................|
|................|            |..................|
|.......App......|/\          |.....Operation....|
|................|  ----------|..................|
|................|\/          |..................|
+----------------+   1      * +------------------+

Например, если вместо приложения «пакет и услуги» вы выполняете программу Paint.

В вашем приложении у вас будет набор действий или операций, и одной из этих операций является «Квадрат с заливкой».

[3] Каждый раз, когда вы выполняете одну из этих операций, даже если она дублируется, у вас есть регистр или журнал каждой операции, которую можно выполнить, или откат.

+----------------+            +------------------+
|................|            |..................|
|................|            |..................|/\   1
|.......App......|/\          |....Operation.....|  --------+
|................|  ----------|..................|\/        |
|................|\/          |..................|          |
+----------------+   1      * +------------------+          |
         /\                                                 |
         \/                                                 |
         |                    +------------------+          |
      1  |                    |..................|          |
         +--------------------|..................|          |
                          *   |.......Log........|----------+
                              |..................|    * (The same operation can be 
                              |..................|       registered in the log,
                              +------------------+       several times)

Когда вы запускаете приложение Paint, вы используете «квадрат с краской» несколько раз.

[4] В вашем списке вам нужна противоположная операция, которая восстанавливает соответствующую.

+----------------+            +------------------+
|................|            |..................|-------+ 1
|................|            |..................|       |
|.......App......|/\          |.....Operation....|       |
|................|  ----------|..................|-------+ 1  
|................|\/          |..................|
+----------------+   1      * +------------------+

Использование предыдущего приложения Paint. Например, у вас должна быть операция «Восстановить заполненный квадрат», которая покидает область, как до того, как пользователь нарисовал заполненный квадрат.

Не волнует, как это делается, заботиться о том, чтобы был соответствующий.

[5] Соответствующая противоположная операция также должна быть зарегистрирована в журнале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...