【发布时间】:2011-05-01 22:58:51
【问题描述】:
假设您的 .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。 (到目前为止我最喜欢的候选人。但是如果数据库出现故障怎么办?)
- 有一个静态缓存来跟踪最近的异常,并且警报系统总是首先检查重复项。 (似乎不必要的复杂,其次,很多错误消息的差异非常小 - 例如,如果错误中有时间戳,则它是无用的。)
- 在某些错误后或基于对关键依赖项的持续监控以编程方式使我们的系统脱机(风险!如果出现短暂的误报怎么办?)
- 只是不对这些错误发出警报,而是依靠系统的不同部分来监视和报告相关性。 (不应对我们没有预料到的“意外”错误。)
这似乎是一个必须解决的问题,而我们正在以一种愚蠢的方式解决它。欢迎提出建议,即使它们涉及完全不同的异常管理策略!
【问题讨论】:
-
你说你喜欢登录数据库的想法。我同意这是控制你想要的最佳选择。但是,您说数据库可能已关闭,这就是您有点害怕此选项的原因。我说你必须忍受这些限制。如果数据库出现故障,您可能会遇到更多问题,而不仅仅是系统的这一部分(异常处理)出现故障。不可能预见所有可能出现并处理所有的事情。否则,我们将不得不构建能够自动处理电力供应不足的系统。
标签: .net design-patterns exception-handling error-handling alerts