Azure 存储队列 - 重试机制实现

Posted

技术标签:

【中文标题】Azure 存储队列 - 重试机制实现【英文标题】:Azure storage queue - retry mechanism implementation 【发布时间】:2021-01-11 02:33:48 【问题描述】:

我正在使用 nuget 包 "Microsoft.Azure.Storage.Queue" Version="11.1.7" 创建 Azure 存储队列客户端,如下所示,

AsyncLazy<CloudQueue> qClient = new AsyncLazy<CloudQueue>( async () =>
    
        var myStorageAccount = CloudStorageAccount.Parse("ConnectionString");
        var myQueue = myStorageAccount .CreateCloudQueueClient()
            .GetQueueReference("QueueName");
        await myQueue.CreateIfNotExistsAsync();
        return myQueue;
    );

希望在通过上面的“qClient”实例向队列发布消息时加入重试机制来克服任何暂时性故障。

如何在上述创建延迟队列连接的方式中加入重试机制?

【问题讨论】:

【参考方案1】:

可以参考这个official document,也可以使用CloudBlobClient.DefaultRequestOptions属性

我写了一个代码示例,也许它可以启发你:

            AsyncLazy<CloudQueue> qClient = new AsyncLazy<CloudQueue>(async () =>
            
                var myStorageAccount = CloudStorageAccount.Parse("ConnectionString");
                var myQueue = myStorageAccount.CreateCloudQueueClient();
                myQueue.DefaultRequestOptions = new QueueRequestOptions
                
                    RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), 4),
                    // For Read-access geo-redundant storage, use PrimaryThenSecondary.
                    // Otherwise set this to PrimaryOnly.
                    LocationMode = LocationMode.PrimaryThenSecondary,
                    // Maximum execution time based on the business use case.
                    MaximumExecutionTime = TimeSpan.FromSeconds(20)
                ;
                var queue = myQueue.GetQueueReference("QueueName");
                await queue.CreateIfNotExistsAsync();
                return queue;
            );

【讨论】:

以上是关于Azure 存储队列 - 重试机制实现的主要内容,如果未能解决你的问题,请参考以下文章

消息队列 - 死信、延迟、重试队列

Azure 存储队列触发 Azure 函数高可用性

RocketMQ高可用设计之消息重试机制

Azure 存储队列 - 异地冗余

PHP-RESQUE重试机制

WebJobs 未重试失败的队列消息