Структурированная обработка исключений с многопоточным сервером

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

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

Итак, мы имеем это:

  • С SEH: только 1 пользователь из 400 получает проблему для большинства сбоев.
  • Без SEH: Если какой-либо пользователь получает сбой, все 400 затронуты.
  • Но иногда с SEH: сервер зависает, все 400 затронуты и будущие пользователи, которые пытаются подключиться.

Ответ 1

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

Ответ 2

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

Использование SEH, когда вам действительно нужно обрабатывать структурированное исключение, прекрасно. Ларри Остерман сделал следующее сообщение, объяснив какие ситуации требуют SEH: файлы с отображением памяти, RPC и переходы границы безопасности.

Ответ 3

Исправить ошибки в вашей программе?;)

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