Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как писать живучие программы ? / 24 сообщений из 24, страница 1 из 1
03.03.2014, 14:54
    #38576902
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Привет.

Хочу поинтересоватся опытом опытных разработчиков )

У меня имеется следующая задачка: написать WCF сервис. Но при этом он должен быть максимально живучим. Если возникают исключительные ситуации, то желательно писать в лог, для последующего анализа, но не падать.
Упавший сервис банально не кому будет перезапустить до вечера или следующего утра :)

Я думаю как бы это сделать.

У меня два решения видится:
1. Обрабатывать каждый пришедший запрос в отдельном потоке (Task). В случае исключения, сваливать его в лог для анализа (со стеком вызовов и тем, что еще смогу записать в лог в try catch).
Но есть особо разрушительные исключения, разрушающих программу и домен, после возникновения которых крайней не рекомендуется что-то вообще делать, а по быстрее завершить программу. Получается нужен список этих разрушительных исключений ( он есть ? ), и тогда в программе проверять - что если это одно из них, убиваем все потоки и выходим.

2. Либо запускать каждый запрос в отдельном EXEшнике вообще. Передавать ему как либо параметры (через параметры ком строки, разделенную память, или через COM или через БД или еще как угодно).
После отработки каждого потока этот EXE все равно завершится, так что почти не важно есть ли у него проблемы с разрушительными исключениями или нет. Он может отчитываться о своей работе в БД. Так мы узнаем как завершилось приложение: успешно или с исключением).
Также придется периодически проверять все запущенные EXEшники и убивать зависшие (если EXE уже 20 минут не выполнил порученную задачу, убиваем его).


Кто нибудь писал "живучие" программы ? Что можете подсказать ?
...
Рейтинг: 0 / 0
03.03.2014, 14:59
    #38576910
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_StudyНо есть особо разрушительные исключения, разрушающих программу и домен

вам кто то про это сказал или вы сами додумались?

не стоит искать проблему там где её нет, и ещё: решай проблемы по мере их возникновения
...
Рейтинг: 0 / 0
03.03.2014, 15:35
    #38576965
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,

а вы на каждый запрос свой AppDomain поднимайте и в нем все выполняйте))
...
Рейтинг: 0 / 0
03.03.2014, 15:46
    #38576978
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study Если возникают исключительные ситуации
...
Рейтинг: 0 / 0
03.03.2014, 15:51
    #38576990
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
1) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает)
2) немного изменить точку зрения - нет смысла ловить все возможные ошибки. Лучше сосредоточиться на достижении ожидаемого результата.
3) свой домен имеет смысл делать только при плагинной архитектуре. В подавляющем большинстве случаев одно приложение перекрывает все требования.

Пример подхода из пункта 2:
http://programmersunlimited.wordpress.com/2011/04/07/method-waitretry-functionality-using-postsharp/
...
Рейтинг: 0 / 0
03.03.2014, 16:15
    #38577013
dvim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,Кто нибудь писал "живучие" программы ?
А в чем проблема требовать от системы писать логи каждую минуту в СУБД.
Далее есть сервис, проверяющий наличие логов. Если их нет более 5 минут - идет рестарт основного сервиса.

В принципе данная схема проста как дерево и успешно работает 5 лет в режиме 7*24.
...
Рейтинг: 0 / 0
03.03.2014, 16:41
    #38577050
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
pation
вам кто то про это сказал или вы сами додумались?

Вот исключение, про которое помню
http://msdn.microsoft.com/ru-ru/library/system.stackoverflowexception(v=vs.110).aspx

"В предыдущей версии платформы .NET Framework приложение могло перехватывать объект StackOverflowException (например, для выхода из состояния неограниченной рекурсии). Однако в данный момент такой подход не одобряется, поскольку для надежного перехвата исключения переполнения стека и продолжения выполнения программы необходимо значительное количество дополнительного кода.
Начиная с платформы .NET Framework версии 2.0 объект StackOverflowException нельзя перехватывать с помощью блока try-catch и соответствующий процесс по умолчанию завершается
"
Есть и другие исключения, которые я сам не помню или даже не знаю. Вроде бы при Out of Memory exception тоже не рекомендуется пытаться делать осмысленную работу в программе, а сразу завершаться.

Я и хотел у форумчан узнать список таких исключений.
Думал, раз есть такие рекомендации, значит им кто-то следует :)
А значит, имеет список этих исключений, при которых программу рекомендуется терминейтить на месте.
...
Рейтинг: 0 / 0
03.03.2014, 16:48
    #38577060
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,

Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory. Наиболее приемлемый вариант ИМХО - это перезапуск приложений, что приводит нас к:

Arm791) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает)
...
Рейтинг: 0 / 0
03.03.2014, 16:54
    #38577064
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study, http://www.idesign.net/Downloads/GetDownload/1987
так для информации
...
Рейтинг: 0 / 0
03.03.2014, 17:06
    #38577070
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Arm79MsSql_Study,

Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory. Наиболее приемлемый вариант ИМХО - это перезапуск приложений, что приводит нас к:

Arm791) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает)

Вы хотите сказать, что "все исключения, после которых нужно завершать программу" и так сделаны не перехватываемыми в try catch и они сами завершают приложение ?
Т.е. самому с этим разбираться не нужно, и можно свободно логировать ЛЮБОЕ исключение ?
...
Рейтинг: 0 / 0
03.03.2014, 17:18
    #38577080
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
buser,

Спасибо. Хотя у меня есть бумажная книга от Леви за 2007 год :) Но думаю информация сжатая в компактный файл, и относящаяся к WCF 4.0 будет очень полезна.
...
Рейтинг: 0 / 0
03.03.2014, 17:34
    #38577097
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study, напишите сервис и попробуйте его "уронить" на том оборудовании, где планируется эксплуатация. По результатам эксперимента сделайте выводы о том, как, на что и где нужно реагировать.
...
Рейтинг: 0 / 0
03.03.2014, 17:50
    #38577118
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_StudyВы хотите сказать, что "все исключения, после которых нужно завершать программу" и так сделаны не перехватываемыми в try catch и они сами завершают приложение ?
Т.е. самому с этим разбираться не нужно, и можно свободно логировать ЛЮБОЕ исключение ?

Вы читаете невнимательно. Например, при OutOfMemory ваша программа просто упадет. Что вы там залогируете? НИЧЕГО.

Мое мнение я высказал:
Arm79нет смысла ловить все возможные ошибки. Лучше сосредоточиться на достижении ожидаемого результата.

Если ошибка перехватывается - логируем. В если нет - приложение падает. И нужно просто его перезапустить. Чем перезапускать - думайте сами. Я про службу и iis сказал.
...
Рейтинг: 0 / 0
03.03.2014, 19:20
    #38577203
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Arm79,

Так я же и задал вопрос "так Microsoft сделали, что исключения, которые разрушают программу до не-работоспособности не отлавливаются в try...catch и валят программу ? Таким образом я могу ловить ВСЕ исключения и безопасно их логгировать (т.к. гарантированно они не относятся к разрушительным)"

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


skyANA,
Не. Вопрос не о том какие исключения может кинуть моя программа - даже о которых я не знаю и не загадывал. Ну например сторонний вызов процедуры упадет, из-за того, что попытался залогировать что-то свое в файл и не смог, вывалив исключение - тут уж не всегда точно предскажешь такие падения.
Вопрос о "разрушительных" исключениях. Нужно ли их ловить самому, или фреймворк просто не допустит их до моего кода.
...
Рейтинг: 0 / 0
03.03.2014, 19:46
    #38577225
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_StudyЕсли да, то все замечательно.
Значит я ошибся. Просто где-то вычитал, что в некоторых ситуациях нельзя продолжать работу
Наверное, имелось ввиду, что программа НЕ В СОСТОЯНИИ продолжить работу.
...
Рейтинг: 0 / 0
03.03.2014, 19:48
    #38577226
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,

а в чем проблема сделать бесконечную рекурсию и попытаться отловить эксепшн? За 10 минут бы разобрались вместо траты на форум целой половинки дня
...
Рейтинг: 0 / 0
03.03.2014, 20:06
    #38577237
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Arm79,

Сделал. Как MSDN и утверждает - try catch не ловит

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    class Program
    {
        private static int i=0;

        private static void Proc()
        {
            Console.WriteLine("proc" + ++i);
            Proc();
        }


        static void Main(string[] args)
        {
            try
            {
                Proc();
            }
            catch (Exception exept)
            {
                Console.WriteLine("catched: " + exept.Message);
                
            }

        }
    }



Код: c#
1.
2.
Process is terminated due to StackOverflowException.
Для продолжения нажмите любую клавишу . . .


И вылетело окно с извинениями от Microsoft.

Но вообще. Вопрос стоит в том - ВСЕ ли разрушительные исключения не ловятся.
Теперь думаю, что да. Раз разработчики фреймворка осознают проблему и сделали StackOverflowException не уловимым (по умолчанию), то можно предположить, что и в отношении других столь-же губительных исключениях сделаны соответствующие выводы.

Но я этого не знал (и не знаю) потому и задал вопрос на форуме. Просто не знаю всего списка "разрушительных исключений", и другие исключения гораздо сложней воспроизвести, чтобы проверить и убедится :)
...
Рейтинг: 0 / 0
03.03.2014, 20:34
    #38577248
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,

Там есть ThreadAbortException кажется еще есть
...
Рейтинг: 0 / 0
03.03.2014, 22:07
    #38577284
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Arm79,

Да, по идее тоже разрушительное исключение, которое может вылететь везде. Опасная штука для программ работающих без остановки. Надо будет обдумать как быть. Планирую использовать Taskи, может обойдется :) Не знаю.
...
Рейтинг: 0 / 0
03.03.2014, 22:10
    #38577287
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_Study,

Изучите WCF Concurrency, InstanceContextMode (PerCall например) и хостинг в IIS...
...
Рейтинг: 0 / 0
03.03.2014, 22:29
    #38577298
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
LelouchMsSql_Study,

Изучите WCF Concurrency, InstanceContextMode (PerCall например) и хостинг в IIS...

Про WCF Concurrency, InstanceContextMode знаю, хотя не и мастер. Да, PerCall наверное улучшит стабильность программы, по сравнению с синглтоном.
А вот с IIS+WCF дел не имел. Win-Service вполне рабочий вариант.
...
Рейтинг: 0 / 0
04.03.2014, 05:47
    #38577386
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_StudyВопрос стоит в том - ВСЕ ли разрушительные исключения не ловятся.
Теперь думаю, что да.
И зря. Например, начиная с .Net 4.0 CSE (corrupted state exceptions) ловятся при наличии у метода атрибута HandleProcessCorruptedStateExceptions . Хотя сами по себе эти исключения вполне разрушительны. Подробности см. здесь .
Arm79Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory.
Где-то я натыкался на сведения о том, что подобные исключения просто разрушают стек двухпроходной обработки - поэтому их обработать и не получается никак.
...
Рейтинг: 0 / 0
04.03.2014, 18:55
    #38578205
MsSql_Study
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
Сон Веры Павловны,

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

Разве что если какие-то сторонние библиотеки, в своих глубинах, но это вряд ли. Не думаю, что это распространенная практика, кому это может пригодится вообще...
Так, что думаю можно пренебречь столь малой вероятностью: что у кого-то будет это свойство выставлено, и надо же, в этом методе это исключение и возникнет :)

Даже если кто-то будет ловить это исключение - полагаю, там же будет и throw, пробрасыващий исключение дальше. Не думаю, что кто-то в здравом уме будет скрывать эту ошибку :)
И оно дойдет уже до моего метода, который не обладает этим атрибутом, где благополучно пролетит мимо catch и завалит приложение.
Думаю это событие можно будет наблюдать... раз этак в 2000 лет.
...
Рейтинг: 0 / 0
05.03.2014, 05:45
    #38578420
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как писать живучие программы ?
MsSql_StudyНе думаю, что это распространенная практика, кому это может пригодится вообще...
Работа с pinvoke/COM interop - достаточно распространенная практика.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как писать живучие программы ? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]