【问题标题】:How can I get SQL Service Broker to actually use all available Queue Readers?如何让 SQL Service Broker 实际使用所有可用的队列读取器?
【发布时间】:2017-12-01 18:18:00
【问题描述】:

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

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

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


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

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

【问题讨论】:

    标签: sql service-broker queuing


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在使用光标来创建会话句柄并为每个摄取任务发送,所以不是这样。好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多