如何让 SQL 服务代理实际使用所有可用的队列读取器?



我已经围绕服务代理构建了一个数据收集框架。 有几个进程用各种作业填充队列。 然后,侦听器(激活的过程)接管作业,决定需要对该项目执行的操作,并将其传递给正确的收集过程。

激活队列的MAX_QUEUE_READERS为 10,但几乎从未达到该限制。 相反,从dm_broker_activated_tasks来看,仅使用 1 或 2 个激活的任务进行处理需要更长的时间。

我怎样才能激励甚至强迫更多的工人?


编辑:此MS文档说它仅每5秒检查一次激活。

这是否意味着如果我的任务花费的时间少于 5 秒,我就无法通过服务代理并行化它们?

Service Broker 有一个特定的并行概念,即会话组。只能并行处理来自不同组的消息。这表现的方式是,RECEIVE 将锁定已取消排队的消息的会话组,并且没有其他 RECEIVE 可以取消来自同一会话组的消息的队列。

因此,即使队列中确实有更多消息,如果它们属于同一会话组,则 SQL Server 也无法激活更多并行读取器。

即使您没有显式管理会话组(几乎没有人这样做),它们也会通过会话句柄也是一个组这一事实进行隐式管理。基本上,每次在同一句柄上发出单个 BEGIN 对话框后跟多个 SEND 时,它们都无法并行处理。如果您为每个 SEND 发出单独的 BEGIN 对话框,则可以并行处理它们,但会丢失订单保证。

最新更新