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

StackOverflow https://stackoverflow.com/questions/164372

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Итак, у нас есть это:

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

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top