【问题标题】:SQL Server 2008 Event-Driven ArchitectureSQL Server 2008 事件驱动架构
【发布时间】:2025-06-17 06:55:02
【问题描述】:

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

我一直在网上四处研究 SQL Server 消息代理、CLR 存储过程和 StreamInsight,但我似乎找不到我正在寻找的东西:一种让 SQL Server 提醒我的服务的方法已收到一条消息。基本上是事件驱动而不是轮询模型。

这存在吗?关于从哪里开始的任何想法?有例子吗?

【问题讨论】:

    标签: c# .net sql-server-2008


    【解决方案1】:

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

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

    如果可能,您需要将与 SQL ... 的打开连接数限制为 1。如果您有多个相关方,请通过该连接推送他们的所有内容,并通过其他方式将其分发给 C# 服务器。

    【讨论】:

    • 非常感谢!我已经阅读了有关 RECEIVE WAITFOR 的信息,但我希望我可以注册一个可以在触发器中调用的 WCF 端点。我不喜欢阻塞线程并保持数据库连接打开的想法。我想我将只使用一个轮询客户端,因为我将至少有三个不同的客户端检查消息;每一个都将在不同的机器上至少有 2 个实例用于扩展和故障转移。这是一个企业应用程序。我可以使用单个客户端来使用 RECEIVE WAITFOR,但一个意味着一个故障点;我绝对不想要。
    • 嗯,一个开放的连接还不错。这不是一个“真实”的东西,等待时没有交通。 SQL 无法推出,因此您只能使用此选项或轮询(如您所知),轮询会带来更多流量,并且可能会在一天内打开更多连接,具体取决于您的事件频率和最低分辨率。
    • 听起来不错。我喜欢关于“一天中更多的流量,也许还有更多的开放连接”的观点。我根本不希望有太多的等待时间!