【问题标题】:Azure Service Bus Queue Maximum Renewal of Message Lock for Batch Processing用于批处理的 Azure 服务总线队列最大更新消息锁
【发布时间】:2018-08-14 07:28:05
【问题描述】:

我正在使用 Azure 服务总线队列通过批处理读取客户端消息。我正在通过 serviceBusClient.ReceiveBatch 从服务总线队列读取消息并将它们写入 SQL 数据库。在写入 SQL 数据库时,我还在后台线程中批量更新每条消息。假设 SQL Server 关闭了 24 小时,然后它等到 sql 启动并将所有消息写入数据库,然后最终调用 CompleteBatch。同时,批量中的所有消息锁定正在自动更新。 现在我想知道我可以在多长时间内(最多几小时)自动更新消息锁定?

private void ServiceBusBatchProcessing()
{
    try
    {
        while ((messages = serviceBusClient.ReceiveBatch(100)) != null && messages.Count() > 0)
        {
            brokeredMessageRenewCancellationTokenSource = new CancellationTokenSource();

            var brokeredMessageRenew = Task.Factory.StartNew(() =>
            {
                while (!brokeredMessageRenewCancellationTokenSource.Token.IsCancellationRequested)
                {

                    if (messages.Any(bm => (DateTime.UtcNow > bm.LockedUntilUtc.AddSeconds(-15))))
                    {
                        foreach (var brokeredMessage in messages)
                        {
                            brokeredMessage.RenewLockAsync();
                        }
                    }
                    Thread.Sleep(10000);
                }

            }, brokeredMessageRenewCancellationTokenSource.Token);


            //
            /*

             Code for writing SQL Database goes here.For any 
             exception(SQLConnection Exception)
             this code does nor return but try again till all messages 
             will be written (guaranteed delivery to sql database) 

             */

            serviceBusClient.CompleteBatch(messages.Select(m => m.LockToken));
            brokeredMessageRenewCancellationTokenSource.Cancel();

        }
    }
    catch (MessageLockLostException)
    {
        try
        {
            foreach (var brokeredMessage in messages)
            {
                brokeredMessage.Abandon();
            }
        }
        catch
        {

        }
    }
    catch (Exception ex)
    {
        // brokeredMessage.Abandon();
        if (messages != null)
        {

        }
    }
    finally
    {
        // Cancel the lock of renewing the task
        brokeredMessageRenewCancellationTokenSource.Cancel();
    }
}

【问题讨论】:

    标签: c# batch-processing azureservicebus


    【解决方案1】:

    您可以根据需要多次更新锁定令牌。消息的传递计数仅在接收消息时增加,而不是在更新锁定令牌期间增加。所以锁更新没有限制。

    您需要确保的一件事是您应该在到期前更新令牌。

    【讨论】:

      【解决方案2】:

      您已经收到的答案是正确的,不限次数。话虽如此,我强烈建议您审查您的设计。 以此为例:

      在写入 SQL 数据库时,我还在后台线程中批量更新每条消息。假设 SQL Server 关闭了 24 小时,然后它等到 sql 启动并将所有消息写入数据库,然后最终调用 CompleteBatch。同时,所有消息的批量锁定​​正在自动更新。

      如果您的 SQL Server 已关闭 24 小时,您为什么会收到任何消息?让我们更新他们的锁定令牌?请记住,您正在执行的操作需要花钱。您收到并更新其锁定的 Evenry 消息算作一次操作。这也使您的实施大大复杂化。还有一点要提出 - 锁定更新可能并且在某些时候失败。这是一个客户端驱动的命令,保证。

      【讨论】:

        猜你喜欢
        • 2017-11-01
        • 1970-01-01
        • 2019-07-23
        • 2020-01-31
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多