1

我有一种情况,我认为工作队列和 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.entitySqlDependency 查询并更改记录时),但它们都收到相同的工作项。我需要在可用进程之间划分工作项,而不知道有多少个侦听器,可能是 2 个或 12 个,具体取决于哪些服务器在线以及哪些服务器离线以进行维护。

客户端将用 C# 编写。

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

4

2 回答 2

1

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

您还可以使用 ServiceBroker,它以事务和快速的方式与 SQL Server 完美集成。

于 2012-07-17T19:02:06.913 回答
1

您不需要在此处涉及查询通知。直接使用服务代理。

让您的 C# 应用程序发布WAITFOR(RECEIVE ...)语句以获取工作任务。当工作可用时,使用SEND. 以安排将来使用的工作BEGIN CONVERSATION TIMER

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

于 2012-07-17T19:27:25.317 回答