0

我已经围绕服务代理构建了一个数据收集框架。有几个 proc 用各种作业填满队列。然后一个监听器(激活的过程)接受这些工作,决定对该项目需要做什么,并将其交给正确的收集过程。

激活队列的 MAX_QUEUE_READERS 为 10,但几乎从未达到该限制。相反,处理 1 或 2 个激活的任务将花费更长的时间,如从dm_broker_activated_tasks.

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


编辑:这个MS 文档说它只每 5 秒检查一次激活。

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

4

1 回答 1

2

Service Broker 有一个特定的并行概念,即会话组。只有来自不同组的消息可以并行处理。这体现在一个 RECEIVE 将锁定出队消息的会话组,并且没有其他 RECEIVE 可以将来自同一会话组的消息出队。

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

即使您没有显式管理对话组(几乎没有人这样做),它们也被隐式管理,因为对话句柄也是一个组。基本上,每次您在同一个句柄上发出一个 BEGIN DIALOG 后跟几个 SEND 时,它们将无法并行处理。如果您为每个 SEND 发出单独的 BEGIN DIALOG,它们可以并行处理,但您失去了订单保证。

于 2017-12-02T07:54:36.643 回答