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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам