существует ли язык защиты от стихийных бедствий? - PullRequest
41 голосов
/ 10 сентября 2009

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

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

Это уже существует? Если так, где я могу найти это? Если нет, то почему это не может быть реализовано? Мне кажется, это очень удобно для критических систем.

p.s. В случае потери соединения с БД это будет означать, что возникла проблема, и необходимо ручное вмешательство. В тот момент, когда соединение восстановится, оно продолжит с того места, где остановилось.

EDIT: Поскольку обсуждение, похоже, прошло, позвольте мне добавить несколько моментов (пока я жду, прежде чем смогу добавить награду к вопросу)

Отклик Эрланга сейчас, похоже, самый высокий. Я знаю об Эрланге и читал прагматичную книгу Армстронга (основного создателя). Это все очень хорошо (хотя функциональные языки заставляют мою голову вращаться при всей рекурсии), но бит «отказоустойчивый» не приходит автоматически. Отнюдь не. Erlang предлагает множество супервизоров и других методологий для контроля процесса и его перезапуска в случае необходимости. Тем не менее, чтобы правильно сделать что-то, что работает с этими структурами, вам нужно быть настоящим гуру erlang, и вам нужно, чтобы ваше программное обеспечение соответствовало всем этим фреймворкам. Кроме того, если питание падает, программист тоже должен собрать кусочки и попытаться восстановить при следующем запуске программы

То, что я ищу, является чем-то гораздо более простым:

Представьте себе язык (такой простой, как, например, PHP), где вы можете делать такие вещи, как запросы к БД, выполнять над ними действия, выполнять операции с файлами, выполнять операции с папками и т. Д.

Однако его главная особенность должна заключаться в следующем: если питание умирает, и вещь перезапускается, она берет из того места, где остановилась (поэтому она не только запоминает, где она была, она также запоминает переменные состояния). Кроме того, если он остановился в середине файловой копии, он также будет корректно возобновлен. и т. д.

И последнее, но не менее важное: если соединение с БД прерывается и не может быть восстановлено, язык просто останавливается и сигнализирует (возможно, syslog) о вмешательстве человека, а затем продолжает с того места, где он остановился.

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

EDIT: Кажется (судя по всем комментариям и ответам), что такой системы не существует. И, вероятно, не будет в ближайшем обозримом будущем из-за невозможности получить (почти?) Право.

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

(или подход к контрольной точке, как указал один из комментаторов (как в видеоигре). Установите контрольную точку .... и, если программа умрет, перезапустите здесь в следующий раз.)

Награда: В последнюю возможную минуту, когда все пришли к выводу, что это невозможно, Стивен С. приходит с napier88, который, кажется, обладает теми качествами, которые я искал. Хотя это экспериментальный язык, он доказывает, что это возможно, и это то, что заслуживает более подробного изучения.

Я буду смотреть на создание своей собственной инфраструктуры (возможно, с постоянным состоянием и снимками), чтобы добавить функции, которые я ищу в .Net или другой виртуальной машине.

Всем спасибо за вклад и отличные идеи.

Ответы [ 28 ]

3 голосов
/ 18 сентября 2009

Существует несколько коммерчески доступных платформ Veritas, Sun's HA, IBM HACMP и т. Д. И т. Д. который будет автоматически отслеживать процессы и запускать их на другом сервере в случае сбоя.

Существует также дорогое оборудование, такое как серия HP Tandem Nonstop, которое может выдержать внутренние сбои оборудования.

Однако программное обеспечение создается народами, и народы любят ошибаться. Рассмотрим предостерегающий рассказ о программе IEFBR14, поставляемой вместе с MVS IBM. По сути, это пустышка NOP, которая позволяет выполнять декларативные биты JCL без реального запуска программы. Это весь оригинальный исходный код: -

     IEFBR14 START
             BR    14       Return addr in R14 -- branch at it
             END

Нет ничего проще кода? За свою долгую жизнь эта программа фактически накопила отчет об ошибках и теперь находится в версии 4.

То есть 1 ошибка на три строки кода, текущая версия в четыре раза больше оригинальной.

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

2 голосов
/ 17 сентября 2009

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

Вы не решаете проблемы сбоя питания в программе. Вы решаете эту проблему с помощью резервного источника питания, батарей и т. Д.

2 голосов
/ 13 сентября 2009

Microsoft Robotics Group представила набор библиотек, которые могут быть применимы к вашему вопросу.

Что такое параллелизм и координация Время выполнения (CCR)?

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

Что такое децентрализованное программное обеспечение Услуги (DSS)?

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

Большинство ответов даны на языках общего назначения. Возможно, вы захотите взглянуть на более специализированные языки, которые используются во встроенных устройствах. Робот - хороший пример для размышлений. Что бы вы хотели и / или ожидали от робота, если он восстановился после сбоя питания?

2 голосов
/ 16 сентября 2009

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

Если это правильно, то я бы направил вас к проблеме остановки :

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

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

Эта классификация сводит любую комбинацию среды, языка и программы к «программе и конечному вводу».

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

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

2 голосов
/ 19 сентября 2009

Если режим сбоя ограничен отказом оборудования, VMware Fault Tolerance утверждает, что вам нужно. Он запускает пару виртуальных машин в нескольких кластерах и, используя то, что они называют vLockstep, первичный vm отправляет все состояния вторичному vm в режиме реального времени, поэтому в случае первичного сбоя выполнение прозрачно переключается на вторичный.

Я предполагаю, что это не поможет сбою связи, который более распространен, чем аппаратный сбой. Для серьезной высокой доступности следует рассмотреть распределенные системы, такие как подход группы процессов Бирмана ( статья в формате PDF или книга Надежные распределенные системы: технологии, веб-службы и приложения ).

2 голосов
/ 10 сентября 2009

Попробуйте использовать существующий интерпретируемый язык с открытым исходным кодом и посмотрите, сможете ли вы адаптировать его реализацию для включения некоторых из этих функций. Реализация C по умолчанию в Python встраивает внутреннюю блокировку (называемую GIL, Global Interpreter Lock), которая используется для «обработки» параллелизма между потоками Python, сменяя каждую из команд «n» VM. Возможно, вы могли бы подключиться к тому же механизму для проверки состояния кода.

2 голосов
/ 15 сентября 2009

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

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

Как функция уровня языка узнает, чтобы перезапустить приложение на новом хосте?

А в случае восстановления приложения на хосте - что, если прошло значительное время, а сделанные ранее предположения / проверки стали недействительными?

T-SQL, PL / SQL и другие транзакционные языки, вероятно, настолько близки, насколько вы получите «защиту от бедствий» - они либо успешно (и данные сохраняются), либо нет. Исключая отключение транзакционной изоляции, трудно (но, вероятно, не невозможно, если вы действительно стараетесь) войти в «неизвестные» состояния.

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

Вам все еще нужно сохранять свое состояние каждый раз, когда это безопасно (коммит).

2 голосов
/ 12 сентября 2009

Чтобы программа продолжила работу с того места, где она остановилась, если машина теряет питание, ей нужно не только сохранить состояние до где-то , ОС также должна «знать», чтобы возобновить его.

Я полагаю, что реализовать функцию "гибернации" в языке можно, но, по моему мнению, постоянное выполнение этого в фоновом режиме, так что оно готово на случай, если случится что-то плохое, похоже на работу ОС.

2 голосов
/ 12 сентября 2009

Однако его главная особенность должна заключаться в следующем: если питание умирает, и вещь перезапускается, она берет то, с чего остановилась (поэтому она не только запоминает, где она была, она также запоминает переменные состояния). Кроме того, если он остановился в середине файловой копии, он также будет корректно возобновлен. и т. д.

... ...

Я смотрел на Эрланга в прошлом. Какими бы приятными ни были отказоустойчивые функции, которые у него есть ... Он не выдерживает отключения питания. Когда код перезапустится, вам придется собирать куски

Если бы существовала такая технология, мне было бы ОЧЕНЬ интересно прочитать об этом. Тем не менее, решение Erlang будет иметь несколько узлов - в идеале, в разных местах - так что, если одно место упадет, другие узлы могут восполнить провисание. Если бы все ваши узлы находились в одном и том же месте и в одном и том же источнике питания (не очень хорошая идея для распределенных систем), то вам не повезло, как вы упомянули в комментарии к комментариям.

2 голосов
/ 13 сентября 2009

Во встроенном мире это может быть реализовано с помощью сторожевого прерывания и ОЗУ с резервным питанием от батареи. Я сам написал такое.

...