📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

rollup.search.backoff_count 配置项用于控制Rollup 搜索操作失败时的最大重试次数

当 Rollup 搜索操作因网络问题、节点不可用或其他临时性错误失败时,系统会根据此配置的值决定最多重试多少次。

配置项属性 #

  • 配置路径: rollup.search.backoff_count
  • 数据类型: Integer(整数)
  • 默认值: 5
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(可以动态更新,无需重启)
  • 废弃状态: 已废弃

配置项详解 #

工作机制 #

重试机制流程

Rollup 搜索请求:
├── 执行搜索
├── 成功?
│   ├── 是 → 返回结果 ✅
│   └── 否 → 继续
├── 重试次数 < backoff_count?
│   ├── 是 → 等待 backoff_millis
│   │   └── 重试
│   └── 否 → 返回失败 ❌

重试策略 #

恒定退避策略

backoff_count: 5
backoff_millis: 1000ms


重试时间线:
尝试 1: 0ms      → 失败
         ↓ 等待 1000ms
尝试 2: 1000ms   → 失败
         ↓ 等待 1000ms
尝试 3: 2000ms   → 失败
         ↓ 等待 1000ms
尝试 4: 3000ms   → 失败
         ↓ 等待 1000ms
尝试 5: 4000ms   → 失败
         ↓ 等待 1000ms
尝试 6: 5000ms   → 超过 backoff_count
         ↓
返回失败 ❌


总耗时: 约 5 秒

错误场景处理 #

可重试的错误:

1. 网络问题
   ├── 连接超时
   ├── 网络中断
   └── 节点不可用


2. 临时错误
   ├── 节点重启中
   ├── 负载过高
   └── 临时性故障


3. 搜索超时
   ├── 响应超时
   ├── 查询执行超时
   └── 节点响应慢


不适合重试的错误:

1. 查询语法错误 ❌
2. 字段不存在 ❌
3. 权限不足 ❌
4. 索引不存在 ❌

代码实现 #

// 初始化退避策略
@Volatile
private var retrySearchPolicy =
    BackoffPolicy.constantBackoff(
        ROLLUP_SEARCH_BACKOFF_MILLIS.get(settings),
        ROLLUP_SEARCH_BACKOFF_COUNT.get(settings)
    )

// 动态更新支持
init {
    clusterService.clusterSettings.addSettingsUpdateConsumer(
        ROLLUP_SEARCH_BACKOFF_MILLIS,
        ROLLUP_SEARCH_BACKOFF_COUNT
    ) { millis, count ->
        retrySearchPolicy = BackoffPolicy.constantBackoff(millis, count)
    }
}

// 执行搜索时使用重试
fun executeCompositeSearch(request: SearchRequest): SearchResponse {
    return retrySearchPolicy.retry {
        // 执行实际的搜索操作
        doSearch(request)
    }
}

配置建议 #

默认配置 #

rollup:
  search:
    backoff_count: 5  # 默认值
    backoff_millis: 1000

建议: 大多数场景使用默认值。

网络不稳定环境 #

rollup:
  search:
    backoff_count: 10  # 增加重试次数
    backoff_millis: 2000

建议: 网络不稳定时增加重试次数和延迟。

高可用环境 #

rollup:
  search:
    backoff_count: 3  # 减少重试次数
    backoff_millis: 500

建议: 网络稳定时可减少重试,加快失败响应。

快速失败 #

rollup:
  search:
    backoff_count: 1  # 只重试一次
    backoff_millis: 500

建议: 需要快速响应时使用。

动态更新 #

PUT /_cluster/settings
{
  "transient": {
    "rollup.search.backoff_count": 8
  }
}

代码示例 #

基础配置 #

rollup:
  search:
    backoff_count: 5

完整重试配置 #

rollup:
  search:
    backoff_count: 5
    backoff_millis: 1000

高重试配置 #

rollup:
  search:
    backoff_count: 10
    backoff_millis: 2000

低延迟配置 #

rollup:
  search:
    backoff_count: 3
    backoff_millis: 500

相关配置 #

配置项作用默认值
search.backoff_count重试次数5
search.backoff_millis重试延迟1000ms
search.enabled搜索功能开关false

注意事项 #

  1. 默认值: 默认值为 5 次。

  2. 动态更新: 支持动态更新,无需重启。

  3. 已废弃: 配置项已废弃,可能在未来版本移除。

  4. 恒定退避: 使用恒定退避策略,每次重试间隔相同。

  5. 总耗时: 总重试耗时约为 backoff_count × backoff_millis

  6. 合理设置: 过多重试会延长失败响应时间。

  7. 错误类型: 只对可重试的错误进行重试。

  8. 配合使用: 应与 backoff_millis 配合使用。

  9. 监控建议: 监控重试次数和成功率。

  10. 网络环境: 根据网络稳定性调整配置。

故障排查 #

重试失败排查

问题: 搜索频繁重试

排查:
├── 检查网络连接
├── 检查节点状态
├── 检查负载情况
└── 检查错误日志


解决:
├── 增加 backoff_count
├── 增加 backoff_millis
├── 修复网络问题
└── 优化集群状态


问题: 重试浪费时间

排查:
├── 检查错误类型
├── 检查是否可重试
└── 检查配置是否合理


解决:
├── 减少 backoff_count
├── 减少 backoff_millis
├── 修复根本原因
└── 使用快速失败模式