【发布时间】:2015-05-17 23:42:54
【问题描述】:
我正在考虑使用实时消息替换我们公司的监控仪表板。
旧概念:
在我们公司,我们有一个仪表板,可以显示 700 多台物理机的(相当详细的)状态,以及添加的元信息。它是大约 1.5 年前由我的一位同事在 ASP.NET Web 窗体(我不喜欢)中构建的,以使调度员能够协调我们的技术人员应该去哪里解决问题(机器位于不同的地理位置)。
不幸的是,该应用程序使用 30 秒的完整页面自动刷新,并在其后进行大查询。它很慢,并且完全重置了您的视图(正如我所说,仪表板包含超过 700 台机器)。我个人想改变这一点。使用起来非常烦人。我们的调度员已经学会忍受这种情况,但我认为他们应该得到更好的待遇。
新概念:
我想在新仪表板上显示相同的内容,但需要实时更新和“消息”日志。在我们公司,我们大约 90% 的工作是在 MS 堆栈上工作,所以我计划使用 ASP.NET MVC、SignalR、SQL Server 和 Knockout。
我目前拥有的
看看这个简单的图表:
+----+ +----+ +----+ +----+ +----+ +----+ +----+
| PC | | PC | | PC | | PC | | PC | | PC | | PC | ... ...
+--+-+ +--+-+ +-+--+ +--+-+ +--+-+ +--+-+ +--+-+
| | | | | | |
| +--+ +--+ +----+ <-+ <-+ <-+
| | | |
+---v---v-----v-----v+ +-----------------------+
| | TCP/IP | |
| Monitoring Backend +---------> Data Enrichment App |
| | | |
+--------------------+ +---------+-------------+
|
+------------------------------+ +---------+
| | |
| +----------------+ | |
+-----v-----+----------> DB Proxy +-----> S Q L |
| | PUB/SUB +----------------+ | |
| Redis | | |
| | +----------------+ +---------+
+-----------+ | TO BE... |
+----------------+
- 我创建了一个小的“数据丰富应用程序”,它通过 TCP/IP 从监控后端接收事件并向事件添加额外的业务数据(例如,设备的位置、主机名旁边的描述性名称、人- 警报的可读翻译等)不包含在监控系统中。
- 丰富的事件从应用程序发送到 Redis。我这样做是为了让其他应用程序能够以订阅者的身份连接到 Redis,因为我在这里输出的数据比监控后端发送的数据更出色且更具可读性。
- 目前唯一的 PUB/SUB-ing 到 Redis 是一个 DB 代理,它监听传入事件并将这些事件发送到数据库 (SQL Server),我已经将其用于历史报告目的,但目前只包含相当简单的数据.
这里的想法是在我的 ASP.NET 应用程序中将 SignalR Hub 订阅到 Redis 后端,以将事件发送到客户端。 (那是 TO BE 部分)
问题:
这个想法是,当客户端导航到仪表板 URL 时,初始概览由 SQL 后端中的状态数据填充。之后,通过 SignalR 接收事件,并通过更改 Knockout 属性来更新视图。
但是,如果客户断开连接(例如,在从一个会议室走到另一个会议室时睡着笔记本电脑),他会错过来自 SignalR 集线器的消息,并且他的仪表板视图不再正确!
可能的解决方案是:
在每次事件更改时通过 SignalR 发送每个设备的完整状态:这是不可能的,因为我必须通过网络发送大量数据。 (我猜至少有 12,000 条 JSON 数据记录)
检测到超时连接后强制完全刷新:我不知道如何使用 SignalR 来实现这一点:(
... ?
处理基于推送的实时数据和保证数据到达的推荐方法是什么?或者我将如何处理从超时连接中恢复?还是让这个实时变得疯狂?
免责声明:我是系统工程师,而不是专业程序员。这是我的第一个实时网络应用程序。关于 SignalR 的其他问题通常不会像这样处理大量数据。
【问题讨论】:
-
最近看到的最好的 ASCII 图片。
-
实现一个简单的机制,使您可以确定是否丢失了消息(例如,在每条消息中发送一个消息号。如果上一条消息和当前消息之间的差异更大比 1 你会知道你错过了一些消息)。如果有消息丢失,请刷新页面。
-
@Pawel 你的意思是实现一个(方轮)消息队列?
-
@Aron - 不。我正在考虑对 SignalR 消息进行编号,以便您可以检测到您错过了一条消息,在这种情况下,您将使用不同的方式(例如 HTTP 请求)获取内容。
-
@Pawel 它是一种被称为消息队列的编程模式的幼稚实现。它是一个东西,查一下。
标签: c# asp.net knockout.js signalr real-time