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

Jon*_*len 19 .net sql-server message-queue service-broker

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

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

Rem*_*anu 18

SSB(SQL Service Broker)具有一个名为Activation的功能,可以将存储过程附加到队列.当队列中有消息消息时,SQL Server将在内部运行此过程.队列附加过程可以是CLR过程,使托管代码业务逻辑模块能够运行(C#,VB.Net etC).

内部激活的存储过程的替代方法是让外部客户端使用WAITFOR(RECEIVE ... )语句"侦听"队列.此语法对于SSB是特殊的,并且在有消息要接收之前执行非池化块.然后,应用程序将接收的消息作为普通的T-SQL结果集(如SELECT)使用.还有一个Service Broker外部激活器示例,它利用事件通知机制知道何时启动应用程序以消耗队列中的消息.

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

  • 我知道这是8年后,但上述评论并非如此.服务代理只能使用外部队列读取器查找.它甚至适用于TPL和EF. (3认同)

Ric*_*kNZ 12

回答你的问题:

我可以从在不同计算机上运行的.NET应用程序中侦听SQL Server Service Broker队列吗?

是.

如果是的话,我应该这样做吗?

如果没有,你会推荐什么?

你可以考虑使用SqlDependency.它在幕后使用Service Broker,但没有明确说明.

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

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

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

如果它有帮助,我会在我的书(Ultra-Fast ASP.NET)中使用示例详细介绍这两个系统.

  • 我刚刚买了你的书,因为它看起来很不错.另外,我得到了支持StackOverflow用户的支持. (3认同)