7

假设您有一个 .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。(到目前为止我最喜欢的候选人。但是如果数据库出现故障怎么办?)
  • 有一个静态缓存来跟踪最近的异常,并且警报系统总是首先检查重复项。(似乎不必要的复杂,其次,许多错误消息略有不同 - 例如,如果错误中有时间戳,它是无用的。)
  • 在某些错误后或基于对关键依赖项的持续监控以编程方式使我们的系统脱机(风险!如果有短暂的误报怎么办?)
  • 只是不对这些错误发出警报,而是依靠系统的不同部分来监视和报告依赖关系。(不满足我们没有预料到的“意外”错误。)

这似乎是一个必须解决的问题,而我们正在以一种愚蠢的方式解决它。建议表示赞赏,即使它们涉及完全不同的异常管理策略!

4

5 回答 5

5

想到的最简单的解决方案是为这个异常块分配一个 ID 号(如 1),并将最后一次通知给管理员的时间记录下来。如果通知之间经过的时间不够长(例如一个小时),请不要再次通知管理员

如果这段代码通常会产生不止一种异常,您可能还需要记录异常的类;如果同一异常的通知之间经过的时间不够大,请不要再次通知管理员

于 2010-10-28T15:39:28.040 回答
1

检查相似性(时间戳可以使用通配符(例如??:??例如))并首先让它们发送给您一段时间。现在检查哪个发生最多。

比如说,A 类有 1000 个例外,B 类有 964 个,C 类有 120 个,D - H 类有 7 个。

这意味着,每 100 次 A 型和 B 型异常、每 10 次 C 型异常以及发生的所有其他异常都向系统管理员发送一封电子邮件。

优点:
+ 准确
+ 防止系统垃圾邮件
+ 不需要太多代码来实现

缺点:
- 需要时间来开发可靠的统计数据
- 重要的异常可能会被意外忽略
- 依赖于人类,这可能总是会失败

于 2010-11-16T02:57:17.573 回答
0

我以前开发过用于向管理员发送电子邮件的监控应用程序,我会不好意思地承认我遇到过你的情况。解决方案是对您的电子邮件进行速率限制。保存在某处发送的最后一封电子邮件的时间,并建立检查以查看自上一封电子邮件在发送之前是否经过了最短时间(例如,10 分钟或更长时间,由您决定)。这样,您可怜的管理员将收到的最大电子邮件数量将是<time issue has been going on> / <period>. 在我之前的系统管理员工作中,这平衡了我们需要知道问题仍然存在以及需要有一个电子邮件箱而不是每小时 1000 封电子邮件。

于 2010-10-28T15:41:27.240 回答
0

我们的一个远程应用程序中有类似的东西。它通过电子邮件向中间邮箱发送所有例外情况,并且每小时运行一个脚本来扫描邮件,并创建一个摘要电子邮件,该电子邮件会触发到我们的团队邮箱(每天最多 24 封邮件),并将其余数据保存到本地数据库以供将来参考。

它不是防弹的,但它相当快速/易于设置。

于 2010-11-12T00:35:22.640 回答
0

我知道这已经得到了回答,但我觉得仍然发布这个很有帮助。

微软一直在添加大量关于云设计模式和架构的信息,从微服务和带有消息队列的服务总线到更细微的细节。这一切都在Microsoft Docs网站上,在Azure Architecture下归档。处理这类问题的特定模式是断路器模式

使用这种模式并不能完全解决问题;仍然存在“我们如何决定通知操作人员的时间?”的问题。一种可能的解决方案是让断路器跳闸,并增加一个内部计数器来为跳闸创建一个唯一标识符(或类似的东西)。然后,后续通知可以使用此标识符。这只是一个示例 - 您可能还有其他方法可以合理地完成此操作。关键是我将使用断路器来处理决策逻辑,方法是将一个断路器放置在您需要拥有它的服务的任何地方,然后将一些东西链接到它上面以提供您所描述的关于通知的服务。不过,至少,您可以避免发送大量电子邮件。

于 2017-07-15T07:44:47.837 回答