|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
Привет. Хочу поинтересоватся опытом опытных разработчиков ) У меня имеется следующая задачка: написать WCF сервис. Но при этом он должен быть максимально живучим. Если возникают исключительные ситуации, то желательно писать в лог, для последующего анализа, но не падать. Упавший сервис банально не кому будет перезапустить до вечера или следующего утра :) Я думаю как бы это сделать. У меня два решения видится: 1. Обрабатывать каждый пришедший запрос в отдельном потоке (Task). В случае исключения, сваливать его в лог для анализа (со стеком вызовов и тем, что еще смогу записать в лог в try catch). Но есть особо разрушительные исключения, разрушающих программу и домен, после возникновения которых крайней не рекомендуется что-то вообще делать, а по быстрее завершить программу. Получается нужен список этих разрушительных исключений ( он есть ? ), и тогда в программе проверять - что если это одно из них, убиваем все потоки и выходим. 2. Либо запускать каждый запрос в отдельном EXEшнике вообще. Передавать ему как либо параметры (через параметры ком строки, разделенную память, или через COM или через БД или еще как угодно). После отработки каждого потока этот EXE все равно завершится, так что почти не важно есть ли у него проблемы с разрушительными исключениями или нет. Он может отчитываться о своей работе в БД. Так мы узнаем как завершилось приложение: успешно или с исключением). Также придется периодически проверять все запущенные EXEшники и убивать зависшие (если EXE уже 20 минут не выполнил порученную задачу, убиваем его). Кто нибудь писал "живучие" программы ? Что можете подсказать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 14:54 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_StudyНо есть особо разрушительные исключения, разрушающих программу и домен вам кто то про это сказал или вы сами додумались? не стоит искать проблему там где её нет, и ещё: решай проблемы по мере их возникновения ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 14:59 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, а вы на каждый запрос свой AppDomain поднимайте и в нем все выполняйте)) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 15:35 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
1) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает) 2) немного изменить точку зрения - нет смысла ловить все возможные ошибки. Лучше сосредоточиться на достижении ожидаемого результата. 3) свой домен имеет смысл делать только при плагинной архитектуре. В подавляющем большинстве случаев одно приложение перекрывает все требования. Пример подхода из пункта 2: http://programmersunlimited.wordpress.com/2011/04/07/method-waitretry-functionality-using-postsharp/ ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 15:51 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study,Кто нибудь писал "живучие" программы ? А в чем проблема требовать от системы писать логи каждую минуту в СУБД. Далее есть сервис, проверяющий наличие логов. Если их нет более 5 минут - идет рестарт основного сервиса. В принципе данная схема проста как дерево и успешно работает 5 лет в режиме 7*24. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 16:15 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
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 тоже не рекомендуется пытаться делать осмысленную работу в программе, а сразу завершаться. Я и хотел у форумчан узнать список таких исключений. Думал, раз есть такие рекомендации, значит им кто-то следует :) А значит, имеет список этих исключений, при которых программу рекомендуется терминейтить на месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 16:41 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory. Наиболее приемлемый вариант ИМХО - это перезапуск приложений, что приводит нас к: Arm791) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 16:48 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, http://www.idesign.net/Downloads/GetDownload/1987 так для информации ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 16:54 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
Arm79MsSql_Study, Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory. Наиболее приемлемый вариант ИМХО - это перезапуск приложений, что приводит нас к: Arm791) нужен хост либо win-сервис (в свойствах можно прописывать действия при краше), либо iis (сам перезапускает) Вы хотите сказать, что "все исключения, после которых нужно завершать программу" и так сделаны не перехватываемыми в try catch и они сами завершают приложение ? Т.е. самому с этим разбираться не нужно, и можно свободно логировать ЛЮБОЕ исключение ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 17:06 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
buser, Спасибо. Хотя у меня есть бумажная книга от Леви за 2007 год :) Но думаю информация сжатая в компактный файл, и относящаяся к WCF 4.0 будет очень полезна. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 17:18 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, напишите сервис и попробуйте его "уронить" на том оборудовании, где планируется эксплуатация. По результатам эксперимента сделайте выводы о том, как, на что и где нужно реагировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 17:34 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_StudyВы хотите сказать, что "все исключения, после которых нужно завершать программу" и так сделаны не перехватываемыми в try catch и они сами завершают приложение ? Т.е. самому с этим разбираться не нужно, и можно свободно логировать ЛЮБОЕ исключение ? Вы читаете невнимательно. Например, при OutOfMemory ваша программа просто упадет. Что вы там залогируете? НИЧЕГО. Мое мнение я высказал: Arm79нет смысла ловить все возможные ошибки. Лучше сосредоточиться на достижении ожидаемого результата. Если ошибка перехватывается - логируем. В если нет - приложение падает. И нужно просто его перезапустить. Чем перезапускать - думайте сами. Я про службу и iis сказал. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 17:50 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
Arm79, Так я же и задал вопрос "так Microsoft сделали, что исключения, которые разрушают программу до не-работоспособности не отлавливаются в try...catch и валят программу ? Таким образом я могу ловить ВСЕ исключения и безопасно их логгировать (т.к. гарантированно они не относятся к разрушительным)" Если да, то все замечательно. Значит я ошибся. Просто где-то вычитал, что в некоторых ситуациях нельзя продолжать работу и запомнил :) Соответственно был сделан вывод, что нужно ловить эти разрушительные исключения по списку и терминейтить программу. skyANA, Не. Вопрос не о том какие исключения может кинуть моя программа - даже о которых я не знаю и не загадывал. Ну например сторонний вызов процедуры упадет, из-за того, что попытался залогировать что-то свое в файл и не смог, вывалив исключение - тут уж не всегда точно предскажешь такие падения. Вопрос о "разрушительных" исключениях. Нужно ли их ловить самому, или фреймворк просто не допустит их до моего кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 19:20 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_StudyЕсли да, то все замечательно. Значит я ошибся. Просто где-то вычитал, что в некоторых ситуациях нельзя продолжать работу Наверное, имелось ввиду, что программа НЕ В СОСТОЯНИИ продолжить работу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 19:46 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, а в чем проблема сделать бесконечную рекурсию и попытаться отловить эксепшн? За 10 минут бы разобрались вместо траты на форум целой половинки дня ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 19:48 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
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.
Код: c# 1. 2.
И вылетело окно с извинениями от Microsoft. Но вообще. Вопрос стоит в том - ВСЕ ли разрушительные исключения не ловятся. Теперь думаю, что да. Раз разработчики фреймворка осознают проблему и сделали StackOverflowException не уловимым (по умолчанию), то можно предположить, что и в отношении других столь-же губительных исключениях сделаны соответствующие выводы. Но я этого не знал (и не знаю) потому и задал вопрос на форуме. Просто не знаю всего списка "разрушительных исключений", и другие исключения гораздо сложней воспроизвести, чтобы проверить и убедится :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 20:06 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, Там есть ThreadAbortException кажется еще есть ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 20:34 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
Arm79, Да, по идее тоже разрушительное исключение, которое может вылететь везде. Опасная штука для программ работающих без остановки. Надо будет обдумать как быть. Планирую использовать Taskи, может обойдется :) Не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 22:07 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_Study, Изучите WCF Concurrency, InstanceContextMode (PerCall например) и хостинг в IIS... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 22:10 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
LelouchMsSql_Study, Изучите WCF Concurrency, InstanceContextMode (PerCall например) и хостинг в IIS... Про WCF Concurrency, InstanceContextMode знаю, хотя не и мастер. Да, PerCall наверное улучшит стабильность программы, по сравнению с синглтоном. А вот с IIS+WCF дел не имел. Win-Service вполне рабочий вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 22:29 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
MsSql_StudyВопрос стоит в том - ВСЕ ли разрушительные исключения не ловятся. Теперь думаю, что да. И зря. Например, начиная с .Net 4.0 CSE (corrupted state exceptions) ловятся при наличии у метода атрибута HandleProcessCorruptedStateExceptions . Хотя сами по себе эти исключения вполне разрушительны. Подробности см. здесь . Arm79Неперехватываемые исключения сделаны такими, так как их обработка изнутри невозможна или сильно затруднена. Например, OutOfMemory. Где-то я натыкался на сведения о том, что подобные исключения просто разрушают стек двухпроходной обработки - поэтому их обработать и не получается никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 05:47 |
|
Как писать живучие программы ?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Ну я не собирался включать данный флаг конечно, я о его существовании даже не знал до сегодня :) Но спасибо за предупреждение. Разве что если какие-то сторонние библиотеки, в своих глубинах, но это вряд ли. Не думаю, что это распространенная практика, кому это может пригодится вообще... Так, что думаю можно пренебречь столь малой вероятностью: что у кого-то будет это свойство выставлено, и надо же, в этом методе это исключение и возникнет :) Даже если кто-то будет ловить это исключение - полагаю, там же будет и throw, пробрасыващий исключение дальше. Не думаю, что кто-то в здравом уме будет скрывать эту ошибку :) И оно дойдет уже до моего метода, который не обладает этим атрибутом, где благополучно пролетит мимо catch и завалит приложение. Думаю это событие можно будет наблюдать... раз этак в 2000 лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2014, 18:55 |
|
|
start [/forum/topic.php?fid=20&msg=38576902&tid=1403169]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 162ms |
0 / 0 |