【发布时间】:2015-07-13 17:52:55
【问题描述】:
我们需要将 SQL Server 数据库中各种表中的数据更改通知外部系统。监控哪些数据的选择在某种程度上由用户控制(可以从我们支持的列表中进行选择)。通知的接收者可能在本地连接的网络上(即在同一个数据中心),也可能是远程的。
我们目前通过数据访问层中的应用程序代码来处理此问题,该代码检测更改并将通知排队到 Service Broker 队列中,该队列由执行实际通知的 Windows 服务监控。不是很实时,但足够接近。
这已被证明存在一些维护问题,因此我们正在考虑使用 SQL Server 中内置的一种更改检测机制。不幸的是,我看过的那些(我想我都看过了)似乎都不太合适:
变更数据捕获和变更跟踪:主要问题是他们需要轮询捕获的信息以确定要传递给接收者的变更。我怀疑这会引入过多的开销。
通知服务:本质上使用 SQL Server 作为 Web 服务器,这是对许可证的可怕浪费。它还需要通过网络中至少两个防火墙进行访问,从安全角度来看这是不可接受的。
查询通知:似乎是最有可能的候选者,但似乎不太适合动态选择要观察的数据元素。每次发送通知后都需要重新注册查询,这意味着我们会让 SQL Server 忙于管理注册
事件通知:旨在通知数据库或实例级事件,并不真正适用于数据更改检测。
关于我想出的最佳想法是使用 CDC 并将插入触发器放在更改数据表上。触发器会将某些内容排队到 Service Broker 队列中,该队列将由其他代码处理以执行通知。这基本上就是我们现在所做的,只是使用 SQL Server 功能进行更改检测。我什至不确定您是否可以将触发器添加到这些表中,但我认为我会在花大量时间使用 POC 之前获得反馈。
这似乎是完成工作的一种糟糕的迂回方式。有没有我遗漏的东西可以让工作更轻松,还是我误解了这些功能之一?
谢谢,对于这个问题的冗长,我深表歉意。
【问题讨论】:
-
您在使用 Service Broker 时遇到了哪些问题?否则我会提议……
-
我们没有特别看到 Service Broker 的问题。这个问题的重点是如何以更清洁、更通用的方式进行变更检测。