Sql server SqlDependency与对WebService的SQLCLR调用

Sql server SqlDependency与对WebService的SQLCLR调用,sql-server,signalr,sqlclr,sqldependency,database-trigger,Sql Server,Signalr,Sqlclr,Sqldependency,Database Trigger,我有一个桌面应用程序,任何表格更改都会通知它。因此,我发现只有两种解决方案非常适合我的情况:SqlDependency和SQLCLR。(我想知道是否有更好的.NET堆栈)我已经构建了这两种结构,并使它们工作起来。我只能比较从SQL Server到客户端的s̲I̲n̲gl̲e̲响应的持续时间 SqlDependency 持续时间:从100ms到4秒 SQLCLR 持续时间:从10ms到150ms 我希望这种结构能够处理高速率通知*,我读过一些SO和博客文章(例如:),还有一位同事提醒我,在大量

我有一个桌面应用程序,任何表格更改都会通知它。因此,我发现只有两种解决方案非常适合我的情况:SqlDependencySQLCLR。(我想知道是否有更好的.NET堆栈)我已经构建了这两种结构,并使它们工作起来。我只能比较从SQL Server到客户端的s̲I̲n̲gl̲e̲响应的持续时间

SqlDependency 持续时间:从100ms到4秒

SQLCLR 持续时间:从10ms到150ms

我希望这种结构能够处理高速率通知*,我读过一些SO和博客文章(例如:),还有一位同事提醒我,在大量请求时,SqlDependency可能会出错,MS提供了一些我没有得到的东西,这可能是我问题的另一个解决方案

*:不是所有时间,而是一个季节;在1-2台服务器上每秒50-200个请求


在高通知率的基础上,同时考虑到性能,我应该继续使用这两个选项中的哪一个,还是有其他选项

无论是
SqlDependency
(即查询通知)还是SQLCLR(即通过触发器调用Web服务)都无法处理该流量(每秒50-200个请求)。事实上,这两种选择在这些数量上都是相当危险的

两个链接页面(SoftwareEngineering.StackExchange.com和TechNet文章上的链接页面)中给出的建议都是更好的选择。关于(即每隔几秒钟轮询一次的自定义队列表)的建议与TechNet文章中的选项1(使用ServiceBroker处理队列)非常相似

我最喜欢排队的想法(完全定制或使用ServiceBroker),并且在高度事务性的系统上使用了完全定制的队列(很容易达到您预期的数量),并取得了很大的成功。这两种选择(当然,在我看来)的利弊是:

  • 服务经纪人
    • 优点:现有(和经验证的)框架(可以扩展并绑定到事务中)
    • 缺点:并不总是易于配置或管理/调试,无法在1秒内轻松地将200个单独的事件聚合为一条消息(每个触发事件仍将有一条消息)
  • 完全自定义队列
    • Pro:可以将多个同时触发事件聚合为单个“消息”发送给客户端(即轮询服务拾取自上次轮询以来发生的任何更改),可以使用更改跟踪/更改数据捕获作为“更改内容”的来源,因此您可能无需构建队列表
    • 缺点:只有在您能够做到的情况下才具有可扩展性(可能与Service Broker一样好,或者更好,但高度依赖于您的技能和经验来实现这一点),需要对边缘案例进行彻底测试,以确保队列处理不会遗漏或重复计数事件
您可能能够将ServiceBroker与更改跟踪/更改检测结合起来。如果有足够简单的方法来确定最后处理的更改(如更改跟踪/更改数据捕获表中所述的更改),则可以设置SQL Server代理作业以每隔几秒钟轮询一次,如果发现有新的更改,则将所有这些更改捕获到一条消息中以发送给Service Broker

一些帮助您入门的文档:

  • (包括变更跟踪和变更数据捕获)

谢谢你的建议,我喜欢确定性,但作为一个普通的sql爱好者,我很难理解上面的概念。服务代理、变更跟踪、排队对我来说都是新鲜事。根据您的选择,您能为我构建结构所必须熟悉的主题提供一个路线图,或者提供一个演示如何实现它的教程吗?我想在这之后,这个答案对像我这样的新手来说会有价值。@ibubi请查看我刚才添加到我的答案中的两个链接。这两种方法都会将您带到关于这些特性的大型文档集的主页。祝你好运