Допустим, у вас есть система .NET, которая должна отправлять уведомления по электронной почте системному администратору при возникновении ошибки.Пример:
try
{
//do something mission critical
}
catch(Exception ex)
{
//send ex to the system administrator
//give the customer a user-friendly explanation
}
Этот блок кода вызывается различными пользователями сотни раз в секунду.
Теперь допустим, что базовый API / сервис / база данных отключен.Этот код будет много, много раз .Бедный администратор собирается разбудить до нескольких миллионов писем в своем почтовом ящике, а разработчик получит грубый телефонный звонок, не то чтобы такой инцидент (кашель) обязательно произошел сегодня утром.
ЭтоДовольно ясно, что это не тот дизайн, который хорошо масштабируется.
Первые несколько решений, которые приходят на ум, имеют некоторые недостатки:
- Записывают ошибки в базу данных, а затем выставляют большое количество ошибок посредством проверки работоспособности HTTP для внешнего мониторинга.сервис, такой как Pingdom .(Мой любимый кандидат на данный момент. Но что, если база данных выйдет из строя?)
- Имеет статический кэш, который отслеживает недавние исключения, и система оповещения всегда сначала проверяет наличие дубликатов.(Кажется излишне сложным, а во-вторых, многие сообщения об ошибках отличаются очень незначительно - например, если в ошибке есть отметка времени, это бесполезно.)
- Программно отключить нашу систему после определенных ошибок или на основе постоянноймониторинг критических зависимостей (Рискованно! Что, если есть кратковременный ложноположительный результат?)
- Просто не оповещайте об этих ошибках и полагайтесь на другую часть системы, чтобы отслеживать и сообщать о зависимостях.(Не учитывает «неожиданные» ошибки, которых мы не ожидали.)
Это похоже на проблему, которая должна быть решена, и мы решаем ее вглупый путь.Предложения приветствуются, даже если они включают совершенно другую стратегию управления исключениями!