【问题标题】:Azure Functions CloudQueue AddMessageAsync QueueRequestOptions LinearRetryPolicy Doesn't Do AnythingAzure Functions CloudQueue AddMessageAsync QueueRequestOptions LinearRetryPolicy 不执行任何操作
【发布时间】:2019-03-18 11:38:57
【问题描述】:

我正在尝试为云队列实施线性重试策略。以前我在每个出队上以编程方式管理重试逻辑,但我在 QueueRequestOptions 上看到了 RetryPolicy 成员,并认为我可以在第一次添加时设置重试策略并让云队列自动管理重试。不幸的是,下面的代码似乎没有做任何事情。它仍然几乎立即重试,并重试 5 次。我试过在创建时设置它,它也不起作用。

我错过了什么?

谢谢!

await cloudQueue.CreateIfNotExistsAsync();

var linearRetryPolicy = new LinearRetry(TimeSpan.FromMinutes(5), 1);

var options = new QueueRequestOptions { RetryPolicy = linearRetryPolicy };

await cloudQueue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(queueItem)), null, null, options, null);

【问题讨论】:

    标签: c# azure azure-functions


    【解决方案1】:

    我就此询问了一位同事,他建议重试策略可能与尝试将消息添加到队列而不是尝试处理来自队列的消息有关。

    我通过实现 IRetryPolicy 并在调用 AddMessageSync 之前禁用存储模拟器对此进行了测试。果然在每次尝试将消息添加到队列失败后都会调用 ShouldRetry。

    希望这对有同样困惑的人有所帮助。

    【讨论】:

      【解决方案2】:

      RetryPolicy 实际上是一个委托,它在评估时返回一个 Microsoft.WindowsAzure.StorageClient.ShouldRetry 委托。它提供了一种轻量级的机制来以受控方式构造状态完整的重试实例。当每个操作开始时,它将评估 RetryPolicy,这将导致 CLR 在幕后创建一个状态对象,其中包含用于配置策略的参数。

      简单线性重试策略示例

      public static RetryPolicy LinearRetry(int retryCount, TimeSpan intervalBetweenRetries)
      {
            return () =>
            {
                 return (int currentRetryCount, Exception lastException, out TimeSpan retryInterval) =>
                 { 
                     // Do custom work here               
                     // Set backoff
                     retryInterval = intervalBetweenRetries;    
                     // Decide if we should retry, return bool
                     return currentRetryCount < retryCount;          
      
                 };
            };
      }
      

      里面的代码

      return () => {
      
      }
      

      符合 Microsoft.WindowsAzure.StorageClient.ShouldRetry 委托的签名,并将包含您的实施细节。

      一旦您构建了上述重试策略,您就可以配置您的客户端以通过

      使用它
      Cloud[Table/Blob/Queue].Client.RetryPolicy = LinearRetry(<retryCount, intervalBetweenRetries>).
      

      它对我有用。希望对您有所帮助。

      【讨论】:

      • 嗨,这似乎不适用于我所处的情况,因为队列对象上没有客户端,而是服务客户端。并且服务客户端没有 RetryPolicy,尽管在 DefaultRequestOptions 中有一个,但它不是采用委托,而是采用 IRetryPolicy 的实例。不过感谢您的帮助!
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2020-07-11
      • 2022-10-01
      • 1970-01-01
      • 2020-10-30
      • 2020-07-30
      相关资源
      最近更新 更多