你能/应该在.NET应用程序中使用SQL Server Service Broker吗?

22

我有许多需要触发应用程序代码的数据库操作。目前我正在使用数据库轮询,但我听说SQL Server Service Broker可以为我提供类似于MSMQ的功能。

  1. 我能从在不同机器上运行的.NET应用程序中侦听SQL Server Service Broker队列吗?
  2. 如果可以,我是否应该这样做?
  3. 如果不行,你会推荐什么?

为什么不标记一个答案,如果它有帮助的话,或者如果你想要更多的答案,可以设置悬赏?(因为这已经五年了,你可能不再遇到这个问题了...) - Noctis
3个回答

22

SSB(SQL Service Broker)拥有名为Activation的功能,使得存储过程可以附加到队列上。当队列中存在待消费的消息时,SQL Server会在内部运行此过程。附加到队列的过程可以是CLR过程,使托管代码业务逻辑模块得以运行(C#、VB.Net等)。

一个替代内部激活存储过程的方法是,使用WAITFOR(RECEIVE ... )语句让外部客户端“监听”队列。这个语法对于SSB来说是特殊的,直到接收到消息之前都会进行非池化阻塞。然后应用程序将接收到的消息作为普通的T-SQL结果集(类似于SELECT)进行消耗。同时,还有一个示例Service Broker External Activator利用事件通知机制来启动应用程序以从队列中消费消息。

如果您想查看利用SSB内部激活的T-SQL代码示例,请查看异步过程执行


我真的很关注它是否适用于向运行在不同机器上的外部应用程序发送消息。 - Jonathan Allen
SSB只能向SQL实例发送消息。您可以在每台单独的机器上使用SQL Express版本。 - Remus Rusanu
3
我知道现在已经过去了8年,但上面的评论不是真实的。服务经纪人与外部队列读取器可以很好地配合使用。它甚至可以与TPL和EF很好地配合使用。 - Matthew Whited

17

回答您的问题:

我能在不同机器上运行的.NET应用程序中监听SQL Server Service Broker队列吗?

可以。

如果可以,那么我应该这样做吗?

如果不行,你有什么建议?

您可以考虑使用 SqlDependency。它在后台使用Service Broker,但不是显式地使用它。

您可以使用 SqlDependency 对象注册一个 SELECT 查询或存储过程。如果另一个命令更改了从查询返回的数据,则会触发事件。您可以注册事件处理程序,并在那时运行任何您想要的代码。或者,您可以使用 SqlCacheDependency,当事件触发时,它只会从 Cache 中删除相关联的对象。

您也可以直接使用Service Broker。但在这种情况下,您需要发送和接收自己的消息,就像使用MSMQ一样。

在负载平衡环境中,SqlDependency 适用于需要在每个 Web 服务器上运行代码的情况(例如刷新缓存)。Service Broker 消息更适用于只需运行一次的代码--例如发送电子邮件。

如果有帮助的话,我的书 (Ultra-Fast ASP.NET)中详细介绍了这两个系统以及使用示例。


4
我刚刚购买了你的书,因为它看起来非常不错。此外,我可以支持一位StackOverflow用户。 - Simon Hughes
谢谢。希望你喜欢它;请告诉我你的想法。 - RickNZ
1
自从你写了这个以后,我在几个项目中使用了SqlDependency。虽然有时它会变得脆弱,但总体来说,它是解决许多问题的好方法。 - Jonathan Allen

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接