无需客户端轮询的实时 .NET 应用程序监控

Real-time .NET app monitoring without client polling

我们正在为 .NET 应用程序(ASP.NET 和 Windows 可执行文件)构建基于 Web 的实时监控系统。这些应用程序可以启动长时间的 运行 运行,并且统计信息会实时显示在网页上。

对于ASP.NET我们发现SignalR是一个完美的解决方案:长运行ning操作(甚至由简单的WebForms表单回发引起)通过SignalR RPC定期调用JS客户端函数来更新监控页面.但我们提出了 2 个警告:

  1. 在 ASP.NET 中,我们需要监控位于多个不同虚拟目录中的多个不同应用程序。我们如何将这些不同应用程序的数据推送到单个 HTML 监控页面?

  2. 另一个应用程序是 .NET Windows 控制台可执行文件,运行 定期按计划执行。我们如何将它的 运行 时间统计信息推送到同一个监控 HTML 页面?我想到一件事——让 EXE 将临时统计信息存储在数据库中,并让客户端从数据库中提取相同的数据,但我们想避免轮询。另一个 - EXE 会定期以给定的时间间隔调用 WebApp,传递数据 - WebApp 会通过相同的 SignalR 调用将其传递给客户端。但是有更好的方法吗?

我使用的一种架构是小型监控收集服务,在每个受监控的应用程序中都有嵌入式监控客户端,Asp.net、Windows 桌面应用程序、控制台应用程序,Windows服务,或其他。

收集服务始终 运行ning。然后 Web 应用程序直接连接到该服务并请求所有受监控应用程序的状态。

受监控的应用程序 运行 一些小型嵌入式客户端,可将特定于应用程序的指标反馈给监控服务。客户端可以提供有关事件或计时器的数据,或者监视服务在计时器本身上请求它。

有了这个,我们就有了一个统一的监控架构 - 运行 的一切都只是与监控服务对话以发送更新,健康查看器客户端只是使用统一协议向服务请求数据。

它基本上是应用于监控的应用服务器模式,并从 SNMP 的设计中汲取了一些灵感。

SignalR 的新手,没有意识到它有针对不同平台的多个客户端。我们将为所有应用程序使用 SignalR .NET 客户端 - 它们都将与主 SignalR 中心对话,直接调用服务器端方法,进而更新监控页面。