封装带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
相关产品推荐
相关产品推荐

