【问题标题】:Can you/should you use SQL Server Service Broker with .NET applications?您可以/应该将 SQL Server Service Broker 与 .NET 应用程序一起使用吗?
【发布时间】:2009-09-21 20:33:47
【问题描述】:

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

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

【问题讨论】:

  • 如果有帮助,您为什么不标记答案,或者如果您想要更多答案,请提供赏金? (因为它已经快 5 年了,你可能不会再为它挣扎了......)

标签: .net sql-server message-queue service-broker


【解决方案1】:

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

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

如果您想查看利用 SSB 内部激活的 T-SQL 代码示例,请查看Asynchronous procedure execution

【讨论】:

  • 我真的在寻找它是否适合将消息发送到运行在与数据库不同的机器上的外部应用程序。
  • SSB 只能向 SQL 实例发送消息。您可以在每台单独的机器上使用使用 SQL Express 版本。
  • 我知道是 8 年后,但上面的评论不是真的。服务代理将与外部队列阅读器一起工作。它甚至适用于 TPL 和 EF。
【解决方案2】:

回答您的问题:

我可以收听 SQL Server 服务吗 来自 .NET 应用程序的代理队列 在不同的机器上运行?

是的。

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

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

您可以考虑使用SqlDependency。它在幕后使用 Service Broker,但不明确。

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

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

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

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

【讨论】:

  • 我刚买了你的书,因为它看起来很不错。另外,我还可以支持 StackOverflow 的另一位用户。
  • 谢谢。我希望你喜欢它;请让我知道你的想法。
  • 自从你写这篇文章以来,我在几个项目中使用了SqlDependency。虽然有时它很脆弱,但总的来说它是解决很多问题的好方法。
【解决方案3】:

一个易于使用的基于 rhino-queues 的 SQL Service Broker 队列库

http://github.com/CoreyKaylor/servicebroker-queues

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多