【问题标题】:Stop a queue's N consumers停止队列的 N 个消费者
【发布时间】:2013-01-04 17:52:50
【问题描述】:

我有一个 SSBS 队列和一个主进程将 M 消息发送到队列。有N 子进程一一获取消息并处理它们。处理完所有消息后,子进程将退出。现在我正在做以下事情,

方法一:

主进程在发送M消息后发送N“EndOfData”。但是它不能很好地工作,因为某些子流程可能会收到多个“EndOfData”消息,因此某些子流程永远不会收到该消息。

方法 2:(扩展方法 1)

为每个子流程分配一个 ID,同时在“EndOfData”消息中嵌入一个 ID。如果消息中的 ID 与其 ID 不匹配,则子流程回滚。但是,由于回滚过多并且队列被禁用,它会导致“平衡消息”问题。

begin tran
begin try
    WAITFOR(
        RECEIVE TOP(1)
            @MessageType = message_type_name,
            @MessageBody = CAST(message_body AS xml)
        FROM
            TargetQueue
    ) , TIMEOUT 1000
    if @MessageType = 'EndOfData' and 
       @MessageBody.value('(//ID/text())[1]', 'int') <> @ID
    BEGIN 
        rollback tran
        waitfor delay '00:00:02'
    END 

有没有好的实现方法?

更新:
子流程将执行以下步骤。

  1. 收到一条消息
  2. 如果“工作”,
    1. 处理消息(可能需要几分钟)
    2. 向队列发送“Info”消息,以告知主进程消息已被处理
  3. 如果“EndOfData”,
    1. 向主进程发送消息“退出”
    2. 收到“Exist”消息的https://..../EndDialog并退出
  4. 如果https://.../EndDialog 2.2 发送的消息,直接接收即可

【问题讨论】:

    标签: sql-server-2008 service-broker


    【解决方案1】:

    另一种方法,假设N = 3

    1. 发送包含3的“EndOfData”类型消息。
    2. 3 个子进程之一收到此消息,发送包含2 的响应消息,退出。所以剩下 2 个正在运行的子进程。
    3. 接收带有2 的响应并发送包含2 的“EndOfData”类型的消息。
    4. 2 个子进程之一收到此消息,发送包含1 的响应消息,退出。所以剩下 1 个正在运行的子进程。
    5. 接收带有1 的响应并发送包含1 的“EndOfData”类型的消息。
    6. 最后运行的子进程收到此消息,发送包含0的响应消息,退出。没有正在运行的子进程。
    7. 接收0 的响应并停止发送“EndOfData”类型的消息。

    【讨论】:

      【解决方案2】:

      使用以下代码并将工作放入事务中。所以脚本块可以在收到EndOfData消息后退出。

      $conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
      $conn.DatabaseName = "..."
      $conn.BeginTransaction()
      $conn.ExecuteNonQuery("Receive message;")
      # do work
      $conn.CommitTransaction()
      

      http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.committransaction.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2022-07-03
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多