You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

封装带HTTP 503重试机制的ADLS操作通用R函数求助

通用ADLS操作重试函数封装方案

可以把重试逻辑封装成高阶函数,让它接受任意ADLS操作函数、对应参数以及重试规则,这样所有ADLS操作都能复用同一套重试逻辑,避免冗余代码。

通用重试函数实现

require(AzureStor)
require(stringr)

# 通用ADLS操作重试函数
retry_adls_operation <- function(func, max_retries = 3, error_pattern = "503", ...) {
  retry_count <- 0
  success <- FALSE
  
  while (retry_count < max_retries && !success) {
    retry_count <- retry_count + 1
    tryCatch({
      # 执行传入的ADLS操作函数,传递所有参数
      func(...)
      success <- TRUE  # 执行成功,标记为完成
      message(paste0("操作执行成功,重试次数: ", retry_count))
    }, error = function(e) {
      # 检查错误是否匹配指定模式
      if (str_detect(e$message, error_pattern)) {
        message(paste0("遇到错误: ", e$message))
        message(paste0("基础设施级故障,重试序号: ", retry_count))
        # 如果是最后一次重试仍失败,抛出错误
        if (retry_count == max_retries) {
          stop(paste0("达到最大重试次数 (", max_retries, "),操作失败: ", e$message))
        }
      } else {
        # 非目标错误,直接抛出,终止重试
        stop(paste0("非重试类错误,终止操作: ", e$message))
      }
    })
  }
}

调用示例

针对不同的ADLS操作,只需传入对应的函数和参数即可:

1. 调用storage_download

# 假设container已提前初始化
retry_adls_operation(
  func = storage_download,
  container = container,
  file = "remote/path/file.csv",
  filename = "local/path/file.csv",
  overwrite = TRUE
)

2. 调用delete_blob

retry_adls_operation(
  func = delete_blob,
  container = container,
  blob = "path/to/blob.txt"
)

3. 调用upload_blob

retry_adls_operation(
  func = upload_blob,
  container = container,
  src = "local/file.txt",
  dest = "remote/file.txt"
)

扩展说明

  • 可以通过修改error_pattern参数,适配其他需要重试的错误类型(比如HTTP 500、超时错误等)
  • 若需要调整重试间隔(比如重试前等待几秒),可以在错误分支中添加Sys.sleep(seconds)实现退避策略
  • 函数内部通过success标记和局部变量控制循环,避免了全局变量的副作用

内容的提问来源于stack exchange,提问作者msr_003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:25