Построение отказоустойчивых вычислительных систем распределенной обработки информации и алгоритмы реконфигурации, страница 9

2)   Отказ во время выполнения процедуры хранения. Как отмечалось выше. Процедура хранения выполняется полностью или не выполняется совсем. Следовательно, нестабильность не будет иметь место.

3)  Отказ во время передачи сообщения запроса или ответа. Как указывалось выше,  фильтрация дубликата и сохранение ответа обеспечит правильное восстановление действий.

Хотя выполнение процедуры хранения (Рис 1.9) достаточно, но не является необходимым. Адресату нет необходимости выполнять процедуру хранения ни после приема запроса, ни до ответа прием запросов и любую обработку до выполнения процедуры хранения можно построить, аналогично, любую обработку после последней процедуры хранения и передачи ответа, можно повторить. Однократного хранения и передачи выполненного после приема и до выработки ответа вполне достаточно. Действительно. Запоминаем перед приемом и сразу после ответа не является необходимым, так как резерв всегда можно обработать от предыдущего действия. Это ведет к правилу П1, представленному ниже.

          Теперь рассмотрим модуль – источник. Если источник отказывает и повторяет запрос, соответствующий ответ можно восстановить на входе адресата. Следовательно, нет необходимости выполнять хранение после получения ответа. Необходимо только обеспечить, чтобы на выходе выполнялось одно действие.

          Если хранение не выполняется до второго действия на том же входе, сообщение ответа, связанное с первым действием будет заменено ответом, связанным с последним действием. В результате, первый ответ не восстанавливается. Это позволяет сформулировать правило П2.

          Приведем два простых правила для выполнения процедуры хранения.

Правило 1. Хранение должно выполняться после того, как сообщение на надежном входе и до того, как результат обработки этого сообщения выдается из задачи.

Правило 2.Хранение должно выполняться между последовательными посылками сообщений на одном и том же выходе.

Правило 1 обеспечивает повторяемость ответа, производимого как результат восприятия и обработки запроса. Правило 2 обеспечивает, что не более чем одно действие будет выполнено на выходе, если модуль источника запустить снова. Правило 2 можно обобщить для случая хранения после каждых действий. Надежный вход должен тогда сохранить ответное сообщение, связанное с предыдущими действиями.

          Правило 1 также предназначено для работы с вложенными действиями. Адресат может сделать дальнейший вложенный вызов на другой модуль. На рис 1.10 представлен такой случай. Из этого рисунка можно видеть, что при любом единичном отказе , выполнение  действий , начатых по запросу 1 полностью завершаются без дальнейшего запоминания. Например, пусть задача 2 отказала через некоторое время после наполнения процедуры хранения. После восстановления задача 2 будет выполняться снова и генерирует запрос 3. Если бы запрос 3 генерировался во время предыдущего выполнения, то он был бы отфильтрован. Если задача 3 уже произвела соответствующий ответ 3, то механизм поддержки восстанавливает оставленный ответ и возвращается к задаче 2. Если до отказа ответ 2 генерировался и потреблялся задачей 1, то дублированный ответ будет отброшен задачей 2.


Рис 1.10

                    Рассмотренные два правила достаточны для обеспечения отказоустойчивости. Они могут быть усилены действиями по запоминанию, автоматически встроенными в программу модуля. Если интерфейс к модулю определяется только с использованием  надежных портов, получается отказоустойчивость. Для гибкости можно сделать примитив хранения для использования на уровне входного языка. Например, программист может использовать в смеси стандартные и надежные порты в одном и том же модуле, и модули могут хранить промежуточные результаты, чтобы  избежать повторных вычислений.