我有许多需要触发应用程序代码的数据库操作。目前我正在使用数据库轮询,但我听说SQL Server Service Broker可以为我提供类似于MSMQ的功能。
- 我能从在不同机器上运行的.NET应用程序中侦听SQL Server Service Broker队列吗?
- 如果可以,我是否应该这样做?
- 如果不行,你会推荐什么?
我有许多需要触发应用程序代码的数据库操作。目前我正在使用数据库轮询,但我听说SQL Server Service Broker可以为我提供类似于MSMQ的功能。
SSB(SQL Service Broker)拥有名为Activation的功能,使得存储过程可以附加到队列上。当队列中存在待消费的消息时,SQL Server会在内部运行此过程。附加到队列的过程可以是CLR过程,使托管代码业务逻辑模块得以运行(C#、VB.Net等)。
一个替代内部激活存储过程的方法是,使用WAITFOR(RECEIVE ... )
语句让外部客户端“监听”队列。这个语法对于SSB来说是特殊的,直到接收到消息之前都会进行非池化阻塞。然后应用程序将接收到的消息作为普通的T-SQL结果集(类似于SELECT)进行消耗。同时,还有一个示例Service Broker External Activator利用事件通知机制来启动应用程序以从队列中消费消息。
如果您想查看利用SSB内部激活的T-SQL代码示例,请查看异步过程执行。
回答您的问题:
我能在不同机器上运行的.NET应用程序中监听SQL Server Service Broker队列吗?
可以。
如果可以,那么我应该这样做吗?
如果不行,你有什么建议?
您可以考虑使用 SqlDependency
。它在后台使用Service Broker,但不是显式地使用它。
您可以使用 SqlDependency
对象注册一个 SELECT
查询或存储过程。如果另一个命令更改了从查询返回的数据,则会触发事件。您可以注册事件处理程序,并在那时运行任何您想要的代码。或者,您可以使用 SqlCacheDependency
,当事件触发时,它只会从 Cache 中删除相关联的对象。
您也可以直接使用Service Broker。但在这种情况下,您需要发送和接收自己的消息,就像使用MSMQ一样。
在负载平衡环境中,SqlDependency
适用于需要在每个 Web 服务器上运行代码的情况(例如刷新缓存)。Service Broker 消息更适用于只需运行一次的代码--例如发送电子邮件。
如果有帮助的话,我的书 (Ultra-Fast ASP.NET)中详细介绍了这两个系统以及使用示例。
SqlDependency
。虽然有时它会变得脆弱,但总体来说,它是解决许多问题的好方法。 - Jonathan Allen一个基于rhino-queues的SQL Service Broker易于使用的队列库。