如何让SQL Service Broker实际使用所有可用的队列读取器?

时间:2017-12-01 18:18:01

标签: sql service-broker queuing

我围绕服务经纪人构建了一个数据收集框架。有几个procs用各种工作填充队列。然后是一个接受工作的监听器(激活程序),决定该项目需要做什么,然后将其交给正确的收集程序。

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

我如何激励甚至强迫更多的工人?

编辑:THIS MS doc说它只检查每5秒激活一次。

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

1 个答案:

答案 0 :(得分:2)

Service Broker有一个特定的并行概念,即conversation group。只能并行处理来自不同组的消息。这表明RECEIVE将锁定出列消息的会话组,而其他RECEIVE不会使来自相同对话组的消息出列。

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

即使您没有明确地管理会话组(几乎没有人会这样做),也会通过会话句柄也是一个组来隐式管理它们。基本上,每次发出一个BEGIN DIALOG,然后在同一个句柄上发出几个SEND,它们就不能并行处理。如果您为每个SEND发出单独的BEGIN DIALOG,它们可以并行处理,但您失去了订单保证。