业务场景:
想象一下有Construction。施工可以是新建筑、桥梁等。施工场地上可能会发生各种物理和环境变化。这些变化可能是例如温度变化。
我们为我们的客户构建了应用程序,该应用程序从施工场收集不同类型的数据,然后用于:
- 显示时间变化图表
- 为施工经理和其他决策者提供见解、警报和通知
当前状态:
应用程序已构建并正在运行。
- 广告。1 - 收集所有数据并使用图表进行可视化
- 广告。2 -我们仍在为这个模块的正确设计而绞尽脑汁
问题:
如何正确设计使用 WCF 服务和套接字进程收集数据的异常数据通知模块?
整体架构设计:
我们的难题有 4 个主要部分:
- 后端数据库 - SQL Server 2008 (Azure SQL)
- 前端 Web 应用程序 - ASP.NET MVC 3(Azure 的 WebRole)。
- 由向我们发送数据的 ZigBee 设备调用的 WCF 4.0 服务(Azure 的 WebRole)。
- Windows 进程使用 Socket IP(用于 Azure 的 WorkerRole)以配置的频率调用 Rfid 读取器。
在数据库中,我们有 2 个单独的表格用于 Rfid 读数和 ZigBee 读数。为了性能,存储结果的表被刻意去规范化:通过多个索引进行更快的查询和分组。我们在前端应用程序中使用 Entity Framework 和带有 Projection 的 Linq 进行数据访问,它运行良好。
异常数据通知模块:
我们的通知模块功能要求是:
- 在以下情况下,向特定施工场地的通知订阅者发送短信和电子邮件:
- 测量数据的值高于阈值 x 出现次数
- 参数有:最小值、最大值、阈值、重复次数、重复时间窗口、传感器类型
例如,我们为特定的施工场地添加了通知/警报。此警报已配置:
- 最小值 = -5
- 最大值 = 40
- 阈值 = 5
- 重复次数 = 5
- 重复时间窗口 = 5min
- 传感器类型 = 温度
所以现在当 ZigBee WCF 或 Rfid Windows Process 获取数据时,可以触发通知/警报。例如:
- 日期:2012-08-19 10:00 值:30 OK
- 日期:2012-08-19 10:01 值:28 OK
- 日期:2012-08-19 10:02 值:40 OK(仍低于 Max + Threshold)
- 日期:2012-08-19 10:03 值:41 OK(仍低于 Max + Threshold)
- 日期:2012-08-19 10:04 值:39 OK
- 日期:2012-08-19 10:05 值:46 OK(高于阈值,重复计数 1)
- 日期:2012-08-19 10:06 值:39 OK
- 日期:2012-08-19 10:07 值:38 OK
- 日期:2012-08-19 10:08 值:39 OK
- 日期:2012-08-19 10:09 值:38 OK
- 日期:2012-08-19 10:10 值:39 OK
- 日期:2012-08-19 10:11 值:38 OK(上次异常发生 > 重复时间窗口,重复计数 0)
- 日期:2012-08-19 10:12 值:41 OK(仍低于 Max + Threshold)
- 日期:2012-08-19 10:13 值:46 OK(高于阈值,重复计数 1)
- 日期:2012-08-19 10:14 值:47 OK(高于阈值,重复计数 2)
- 日期:2012-08-19 10:15 值:46 OK(高于阈值,重复计数 3)
- 日期:2012-08-19 10:16 值:47 OK(高于阈值,重复计数 4)
- 日期:2012-08-19 10:17 值:46 OK(高于阈值,重复计数 5)-> ALERT!
架构设计要求:
所有逻辑都必须在业务层内,这意味着我们不能使用存储过程和触发器
可能的解决方案1:
我们的第一个想法是为 ZigBee 和 Rfid 服务附加模块逻辑,但这可能会导致性能堵塞。如果我们调用 DB 最后检查 Service 的每个请求,我们会生成大量计算事务,这些事务甚至可能以死锁结束。我们可以在这里使用 WCF 队列机制,但是我们仍然看不到任何可以解决此问题的好处。
对此解决方案的任何建议表示赞赏。
可能的解决方案2:
第二个想法是部署另一个 Windows 进程,该进程将在后台以配置的频率扫描数据库,如果发生“高于阈值”,则将此信息保存到单独的“缓存”表中,并在数据库中“标记”已检查特定的该行通知/警报。所以以后它不会被添加到扫描中。
这意味着:
- 另一个“缓存”表
- 我们将“扫描仪”配置为 30 分钟频率的传递通知/警报的延迟
- 为“特定通知”“标记”行的某种方式,我们不能简单地添加 Bool 标志,因为许多定义的通知可能会计算 1 行的读数(建筑场的 3-4 个通知)
- 有多少“流程”、“后台工作人员”应该同时工作?与现有通知配置相同,或者所有通知配置一个,使用堆栈?
对此解决方案的任何建议表示赞赏。
结论:
如果您有任何想法、经验、了解现有解决方案 (dll)、处理此类问题的模式并与我们分享,我们将不胜感激。