SqlDependency 与对 WebService 的 SQLCLR 调用
SqlDependency vs SQLCLR call to WebService
我有一个桌面应用程序,应在任何 table 更改时通知它。因此,我发现只有两个解决方案非常适合我的情况:SqlDependency 和 SQLCLR。 (我想知道 .NET 堆栈中是否有更好的)我已经构建了这两个结构并使它们工作。我只能比较从 SQL 服务器到客户端的 s̲i̲n̲gl̲e̲ 响应的持续时间。
SqlDependency
持续时间: 从 100 毫秒到 4 秒
SQLCLR
持续时间: 从 10 毫秒到 150 毫秒
我希望这种结构能够处理高速率通知*,我已经阅读了一些 SO 和博客文章(例如:here) and also am warned from a colleague that on mass requests SqlDependency may go wrong. Here,MS 提供了一些我没有得到的东西,可能是我问题的另一种解决方案。
*:不是所有时间,而是一个季节;在 1-2 个服务器上每秒 50-200 个请求。
在高通知率和性能的基础上,我应该继续使用这两个中的哪一个,或者还有其他选择吗?
SqlDependency
(即查询通知)和 SQLCLR(即通过触发器调用 Web 服务)都无法满足该流量(每秒 50-200 个请求) .事实上,在这些数量下,这两种选择都非常危险。
两个链接页面(SoftwareEngineering.StackExchange.com 和 TechNet 文章)中给出的建议都是更好的选择。 Best way to get push notifications to server from ms sql database (i.e. custom queue table that is polled every few seconds) is very similar to option #1 of the Planning for Notifications TechNet 文章中的建议(使用 Service Broker 来处理队列的处理)。
我最喜欢排队的想法(完全自定义或使用 Service Broker),并且在高度事务性系统(很容易达到您预期的数量)上使用完全自定义队列并取得了很大成功。这两个选项之间的优缺点(当然是我所看到的)是:
- 服务代理
- 专业版:现有(和经过验证的)框架(可以扩展并绑定到事务中)
- 缺点:配置或管理/调试并不总是那么容易,不能轻易地将 1 秒内的 200 个单独事件聚合到一条消息中(每个触发事件仍然是 1 条消息)
- 完全自定义队列
- Pro:可以将许多同时触发的事件聚合成单个 "message" 给客户端(即轮询服务获取自上次轮询以来发生的任何更改),可以使用更改跟踪/更改数据捕获作为来源"what changed" 所以你可能不需要建立队列 table.
- 缺点:只有您能够实现的可扩展性(可能与 Service Broker 一样好或更好,但在很大程度上取决于您的技能和经验才能实现),需要对边缘案例进行全面测试以确保队列处理不会遗漏或重复计算事件。
您可以将 Service Broker 与变更跟踪/变更检测相结合。如果有一种足够简单的方法来确定上次处理的更改(如更改跟踪/更改数据捕获中所述的更改 table(s)),那么您可以设置一个 SQL 服务器代理作业来每隔几秒轮询一次,如果您发现有新的更改,则将所有这些更改抓取到一条消息中发送给 Service Broker。
一些帮助您入门的文档:
- Track Data Changes(涵盖变更跟踪和变更数据捕获)
- SQL Server Service Broker
我有一个桌面应用程序,应在任何 table 更改时通知它。因此,我发现只有两个解决方案非常适合我的情况:SqlDependency 和 SQLCLR。 (我想知道 .NET 堆栈中是否有更好的)我已经构建了这两个结构并使它们工作。我只能比较从 SQL 服务器到客户端的 s̲i̲n̲gl̲e̲ 响应的持续时间。
SqlDependency
持续时间: 从 100 毫秒到 4 秒
SQLCLR
持续时间: 从 10 毫秒到 150 毫秒
我希望这种结构能够处理高速率通知*,我已经阅读了一些 SO 和博客文章(例如:here) and also am warned from a colleague that on mass requests SqlDependency may go wrong. Here,MS 提供了一些我没有得到的东西,可能是我问题的另一种解决方案。
*:不是所有时间,而是一个季节;在 1-2 个服务器上每秒 50-200 个请求。
在高通知率和性能的基础上,我应该继续使用这两个中的哪一个,或者还有其他选择吗?
SqlDependency
(即查询通知)和 SQLCLR(即通过触发器调用 Web 服务)都无法满足该流量(每秒 50-200 个请求) .事实上,在这些数量下,这两种选择都非常危险。
两个链接页面(SoftwareEngineering.StackExchange.com 和 TechNet 文章)中给出的建议都是更好的选择。 Best way to get push notifications to server from ms sql database (i.e. custom queue table that is polled every few seconds) is very similar to option #1 of the Planning for Notifications TechNet 文章中的建议(使用 Service Broker 来处理队列的处理)。
我最喜欢排队的想法(完全自定义或使用 Service Broker),并且在高度事务性系统(很容易达到您预期的数量)上使用完全自定义队列并取得了很大成功。这两个选项之间的优缺点(当然是我所看到的)是:
- 服务代理
- 专业版:现有(和经过验证的)框架(可以扩展并绑定到事务中)
- 缺点:配置或管理/调试并不总是那么容易,不能轻易地将 1 秒内的 200 个单独事件聚合到一条消息中(每个触发事件仍然是 1 条消息)
- 完全自定义队列
- Pro:可以将许多同时触发的事件聚合成单个 "message" 给客户端(即轮询服务获取自上次轮询以来发生的任何更改),可以使用更改跟踪/更改数据捕获作为来源"what changed" 所以你可能不需要建立队列 table.
- 缺点:只有您能够实现的可扩展性(可能与 Service Broker 一样好或更好,但在很大程度上取决于您的技能和经验才能实现),需要对边缘案例进行全面测试以确保队列处理不会遗漏或重复计算事件。
您可以将 Service Broker 与变更跟踪/变更检测相结合。如果有一种足够简单的方法来确定上次处理的更改(如更改跟踪/更改数据捕获中所述的更改 table(s)),那么您可以设置一个 SQL 服务器代理作业来每隔几秒轮询一次,如果您发现有新的更改,则将所有这些更改抓取到一条消息中发送给 Service Broker。
一些帮助您入门的文档:
- Track Data Changes(涵盖变更跟踪和变更数据捕获)
- SQL Server Service Broker