在多个进程之间拆分工作队列



我认为工作队列和SqlDependency非常适合,但我很难将它们拼凑在一起。

假设我有1000个实体,每个实体必须以不同的时间间隔(即15、30或45分钟)进行"处理"。我希望在多个进程之间分配工作,而不必每分钟轮询SQL Server以查找更多的工作。我读了很多与SqlDependency/Query通知相关的文章,但不知道如何对工作进行排队,以及如何将每个进程限制为一组工作项。

我写了一个SqlDependency查询,如下所示:

select f1, f2, etc from dbo.entity where LastRunDt < datediff(minute, 15, @dt)

查询运行时有0个结果,但当15分钟后会导致此记录集发生更改(其中包含更多项)时,不会触发通知。我猜它不会以这种方式工作,所以我被困在如何让工作项排队的问题上。

此外。。当我将两个进程附加到同一个工作队列时,每个进程都会收到通知(当我运行select * from dbo.entity SqlDependency查询并更改记录时),但它们都接收到相同的工作项。我需要在不知道有多少侦听器的情况下,在可用进程中划分工作项,可能是2个或12个,这取决于哪些服务器处于联机状态,哪些服务器处于脱机状态以进行维护。

客户端将使用C#编写。

任何已知的模式、想法或方向都将不胜感激。

这里不需要涉及查询通知。直接使用Service Broker。

让您的C#应用程序发出WAITFOR(RECEIVE ...)语句来获得工作任务。当工作可用时,使用SEND将消息排入队列。要安排将来的工作,请使用BEGIN CONVERSATION TIMER

此外,Service Broker可以帮助您实际激活C#代码,无论是作为内部托管存储过程(请参阅Service Broker激活)还是作为外部独立应用程序(请参阅ServiceBroker external Activator)。

听起来您需要某种消息排队。有一些常见的中间件包,如NServiceBus。

您还可以使用ServiceBroker,它以事务性和快速的方式与SQL Server很好地集成。

最新更新