2011-06-30 25 views
1

我正在寻找最有效的方式来构建存储/处理数据的后端。基本上,数据发送到服务器,解析然后保存到数据库。然后根据数据库中的其他数据完成一些处理,然后通过电子邮件或短信引发警报。Sql服务代理,CLR集成,触发后端问题

该平台是.NET和数据库是SQL Server 2005或2008年可能

  1. 温度传感器向服务器发送4个字节的数据。
  2. 服务器将数据转换为实数值,例如20.
  3. 然后将该值保存到SQL服务器数据库。
  4. 然后根据表中设置了该传感器边界的行检查该值,即0-50
  5. 如果在边界之外引发警报。 (通过短信或电子邮件发送)

这一切似乎都很直接,但我正在寻找最好的方法来做到这一点,因为理想的情况是这一切都发生在'实时'可能是每秒100或1000的请求。我想利用SQL 2005/08的一些'新'功能,如Service Broker,CLR集成,触发器等,我几乎没有经验。

步骤1 & 2已经完成。

考虑用于排队的事务数量,使用Service Broker还是MSMQ是明智的选择?鉴于我需要查看边界数据,在什么时候处理警报数据?我有一些想法,我希望如何处理数据,但不确定使用的最佳技术/方法。

我的想法是(从步骤3开始)将数据提交给服务代理,服务代理又调用CLR过程来处理数据上的“业务逻辑”。或者,我是否使用触发器将数据添加到Service Broker以处理数据呢?服务代理可以直接调用CLR过程吗?考虑到我想处理更多事件驱动的数据而不是轮询,是否正在使用服务代理?

从我在Service Broker上看到的例子看起来好像您需要有代码来接收数据,而我真正想要做的就是将数据添加到队列中并自动清空队列(处理警报数据如此)。

我可以通过一个标准的存储过程来完成所有这些工作,但我希望最小限度地使用存储过程,而不是使用CLR集成,因为业务逻辑将比示例中复杂得多。

鉴于服务代理处理排队和线程,我认为它可能是一个很好的候选人调用CLR过程来处理警报数据并发送短信或电子邮件?

请给我看看灯!谢谢!

回答

2

看看复杂事件处理解决方案的领域。有OsiSoft(PI系统),Streambase,Oracle和其他领先的产品。微软有Streaminsight,尽管这是第一代产品,并不保证交付或支持持久性。

3

如果全功能事件监控解决方案对您可行,dportas和SPE109提供了很好的建议。

我可以回答有关Service Broker的具体问题,你曾提出,虽然:

  • 服务代理可以处理您指定的数据速率。微软Service Broker的主要负责人之一Remus Rusanu用便宜的商品硬件实现了每秒超过1000个事件的消息吞吐量。
  • 无论您是使用批处理过程提交给Service Broker,还是触发器在很大程度上都是偏好问题,以及它如何适合您的工作流程。这两种方法都可以工作。
  • 如果您使用Service Broker,则可以使用内部激活过程(标准SQL存储过程)或外部激活器(单独的过程)。我没有外部激活的经验,但对于内部激活,您必须编写一个SQL过程,Service Broker随后会在消息进入给定队列时调用该过程。该过程可以调用CLR过程对接收到的消息数据执行操作。

一个更根本的问题是:什么是服务代理给你,“标准”的方法(将数据保存到数据库,然后查询它的每一秒和批处理过程,进来事件)不?

当您需要消息持久性和排序,当您在SQL Server实例之间进行通信时,或者您可以利用其机制为您完成大部分工作时,Service Broker非常棒。在这种情况下,考虑到您的问题陈述,听起来不像持久性和排序是特别重要的。你想保持数据标签,并在违反边界条件时发出警报。除非处理消息的顺序依赖,否则我会认为轮询批处理可以更简单地完成工作,并且不会造成Service Broker的设置开销。

+1

问题并未说明是否需要消息持久性,订购和服务器间通信。 @Matt如果服务器不可用,那么消息是否丢失很重要?如果它确实需要消息持久性。如果你在5分钟之前得到10分钟前的消息是一个问题?如果是这样你需要订购。你打算在多个SQL服务器上运行这个吗?如果是这样的话,内部服务器通信可能会有用 –

+0

嗨。好点。我必须考虑这些问题。是的,如果信息丢失,这很重要,但我认为我已经从源头上解决了这个问题。在我的例子中,传感器数据来自数据记录器中的一个记录,该记录已经保存在FIFO中。如果记录未传送,则不会从FIFO中删除并稍后再发送。在这个阶段,我不认为排序是重要的,因为有效载荷将有一个“创建记录”日期戳。我想说,首先它可能会是一台服务器,但随着项目规模的增加,未来肯定会更多。 – Matt