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

时间:2012-07-17 16:02:37

标签: c# sql-server-2008 service-broker sqldependency

我有一种情况,我相信工作队列和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分钟过去会导致此记录集更改(其中包含更多项)时,不会触发通知。我猜它不会这样,所以我坚持如何让工作项排队。

另外..当我将2个进程附加到同一个工作队列时,会通知每个进程(当我运行select * from dbo.entity SqlDependency查询并更改记录时),但它们都接收相同的工作项。我需要在可用进程之间对工作项进行分区,而不知道有多少侦听器,可能是2或12,具体取决于哪些服务器在线以及哪些服务器脱机进行维护。

客户端将使用C#编写。

非常感谢任何已知的模式,想法或方向。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您不需要在此处涉及查询通知。直接使用Service Broker。

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

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