2012-04-27 87 views
4

我正在创建一个基于消息的架构,目前使用轮询客户端来检索消息。出于显而易见的原因,我想将我的客户端注册到SQL Server 2008,以便在将消息插入到表中时接收事件。SQL Server 2008事件驱动架构

我一直在围绕Web研究SQL Server Message Broker,CLR存储过程和StreamInsight,但似乎无法找到所需的东西:SQL Server提醒我的服务的一种方式已收到一条消息。基本上是事件驱动而不是轮询模式。

这是存在吗?任何想法从哪里开始?有没有例子?

回答

3

是的,这确实存在。我已经使用SQL Service Broker取得了成功。我不熟悉你列出的其他选项。

设置SSB很痛苦,因为有太多的移动部件和细节,但它很好地工作。帮助您避免轮询的主要部分是您从C#创建并调用的存储过程。在这个简短的程序中是一个RECEIVE WAITFOR语句,它阻止你的开放和事务处理连接,直到你的队列中有一条消息可用,或者你的超时命中。在C#中,无论您是得到结果还是超时,都会立即再次运行该过程以等待下一个项目。

如果可能,您需要将打开的SQL连接数限制为1。如果你有多个感兴趣的团体,通过一个连接推送他们所有的东西,并通过其他方式将其分发给C#服务器。

+0

非常感谢!我已阅读了RECEIVE WAITFOR,但我希望能够注册一个可以在触发器内调用的WCF端点。 我不喜欢阻塞线程并保持数据库连接打开的想法。我想我只会使用一个轮询客户端,因为我将至少有三个不同的客户端检查消息;其中每一个将在不同的机器上至少有2个实例用于扩展和故障转移。这是一个企业应用程序。 我可以使用一个客户端来使用RECEIVE WAITFOR,但其中一个意味着一个故障点;我绝对不想要。 – NickV 2012-04-27 15:52:07

+0

那么,开放的连接并不是那么糟糕。这不是一个“真实”的东西,在等待的时候没有交通。 SQL不能推出,所以你留下了这个或者轮询(如你所知),轮询在一天中的更多流量和更多的开放连接,这取决于你的事件频率和最小分辨率。 – 2012-04-27 17:15:28

+0

听起来不错。我喜欢关于“在一天中更多交通和更多开放联系”的观点。我不期待太多的等待时间! – NickV 2012-04-27 17:31:26