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

配置项作用 #

jobscheduler.sweeper.backoff_millis 配置项用于控制作业清扫器(Job Sweeper)在执行搜索请求失败时的重试退避初始延迟时间

当清扫器遇到可重试的错误(如 502 Bad Gateway、504 Gateway Timeout、503 Service Unavailable)时,会使用指数退避策略进行重试,此配置作为退避算法的起始延迟值。

配置项属性 #

  • 配置路径: jobscheduler.sweeper.backoff_millis
  • 数据类型: TimeValue(时间值)
  • 默认值: 50ms(50毫秒)
  • 最小值: 必须大于 0
  • 最大值: 约 24 天(Integer.MAX_VALUE 毫秒)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(支持动态更新)

配置项详解 #

工作机制 #

指数退避算法

退避时间公式:
delay(n) = start + 10 × (e^(0.8×n) - 1) 毫秒

其中:
- start: backoff_millis 配置值
- n: 第 n 次重试(从 0 开始)


计算示例 (backoff_millis = 50ms):

重试 0 (第 1 次尝试):
delay = 50 + 10 × (e^0 - 1) = 50ms

重试 1 (第 2 次尝试):
delay = 50 + 10 × (e^0.8 - 1) ≈ 62ms

重试 2 (第 3 次尝试):
delay = 50 + 10 × (e^1.6 - 1) ≈ 80ms

重试 3 (第 4 次尝试):
delay = 50 + 10 × (e^2.4 - 1) ≈ 111ms

重试 4 (第 5 次尝试):
delay = 50 + 10 × (e^3.2 - 1) ≈ 161ms

重试 5 (第 6 次尝试):
delay = 50 + 10 × (e^4.0 - 1) ≈ 245ms

重试流程 #

清扫器搜索失败重试流程

retry_count = 3, backoff_millis = 50ms

搜索请求:
├── 尝试 1: 失败 (502)
│   ↓ 等待 ~50ms
├── 尝试 2: 失败 (504)
│   ↓ 等待 ~62ms
├── 尝试 3: 失败 (503)
│   ↓ 等待 ~80ms
└── 尝试 4: 失败
    ↓
  最终失败 ❌


如果任一尝试成功,立即返回 ✅

可重试的错误状态码 #

会触发退避重试的 HTTP 状态码

502 Bad Gateway:
├── 网关或代理服务器错误
├── 通常是临时性故障
└── 适合退避重试 ✅


503 Service Unavailable:
├── 服务暂时不可用
├── 可能是过载或重启
└── 适合退避重试 ✅


504 Gateway Timeout:
├── 网关超时
├── 可能是后端响应慢
└── 适合退避重试 ✅

配置建议 #

生产环境(默认) #

jobscheduler:
  sweeper:
    backoff_millis: 50ms  # 默认值

建议: 保持默认值 50ms。适用于大多数场景。

高负载环境 #

jobscheduler:
  sweeper:
    backoff_millis: 100ms  # 增加退避时间

建议: 增加到 100-200ms。集群负载高时使用,给系统更多恢复时间。

快速恢复场景 #

jobscheduler:
  sweeper:
    backoff_millis: 20ms  # 减少退避时间

建议: 减少到 20-30ms。需要快速重试时使用。

大规模集群 #

jobscheduler:
  sweeper:
    backoff_millis: 200ms  # 更长退避时间
    period: 10m

建议: 增加到 200ms 或更多。大规模集群配合更长周期使用。

代码示例 #

easysearch.yml 基础配置 #

jobscheduler:
  sweeper:
    backoff_millis: 50ms

高负载配置 #

jobscheduler:
  sweeper:
    backoff_millis: 100ms
    period: 10m
  retry_count: 5

快速恢复配置 #

jobscheduler:
  sweeper:
    backoff_millis: 20ms
    period: 1m
  retry_count: 2

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "jobscheduler.sweeper.backoff_millis": "100ms"
  }
}

相关配置 #

配置项作用默认值
jobscheduler.sweeper.backoff_millis退避初始延迟50ms
jobscheduler.retry_count重试次数3
jobscheduler.request_timeout请求超时时间10s
jobscheduler.sweeper.period清扫周期5m

性能影响分析 #

backoff_millis 设置优点缺点
20ms快速重试可能加重负载
50ms(默认)平衡恢复和负载标准设置
100ms给系统恢复时间故障恢复稍慢
200ms+最大程度保护系统故障恢复慢

总退避时间对比 #

假设 retry_count = 3

backoff_millis = 20ms:
退避: 20ms, 24ms, 30ms, 38ms
总退避: ~110ms


backoff_millis = 50ms (默认):
退避: 50ms, 62ms, 80ms, 111ms
总退避: ~300ms


backoff_millis = 100ms:
退避: 100ms, 124ms, 161ms, 221ms
总退避: ~600ms


backoff_millis = 200ms:
退避: 200ms, 248ms, 321ms, 441ms
总退避: ~1.2s

使用场景 #

推荐使用默认值的场景 #

  • 标准环境: 集群运行稳定
  • 正常负载: 集群负载在正常范围
  • 常规容错: 需要基本的容错能力

推荐增加退避时间的场景 #

  • 高负载环境: 集群经常高负载
  • 不稳定系统: 系统稳定性差
  • 资源紧张: CPU、内存资源紧张
  • 大规模集群: 节点多、交互复杂

推荐减少退避时间的场景 #

  • 快速恢复: 需要快速从故障中恢复
  • 稳定环境: 集群非常稳定
  • 低延迟要求: 对延迟敏感
  • 小规模集群: 节点少、负载轻

与重试次数的配合 #

backoff_millis 和 retry_count 的协同

配置 1: 标准配置
backoff_millis: 50ms
retry_count: 3
├── 退避: 50ms, 62ms, 80ms, 111ms
└── 总退避: ~300ms
总耗时: ~30s + 300ms (假设每次超时10s)


配置 2: 高容错配置
backoff_millis: 100ms
retry_count: 5
├── 退避: 100ms, 124ms, 161ms, 221ms, 311ms
└── 总退避: ~900ms
总耗时: ~60s + 900ms


配置 3: 快速恢复配置
backoff_millis: 20ms
retry_count: 2
├── 退避: 20ms, 24ms, 30ms
└── 总退避: ~75ms
总耗时: ~30s + 75ms

退避策略更新 #

动态更新退避策略

配置更新时:
backoff_millis: 50ms → 100ms
    │
    ↓
监听器触发
    │
    ↓
更新 sweepSearchBackoffMillis
    │
    ↓
调用 updateRetryPolicy()
    │
    ↓
重新创建 BackoffPolicy:
BackoffPolicy.exponentialBackoff(100ms, retryCount)
    │
    ↓
新策略生效 ✅

注意事项 #

  1. 默认值: 默认值为 50ms,适用于大多数场景。

  2. 时间格式: 支持 50ms1s 等时间格式。

  3. 动态更新: 支持动态更新,修改后立即生效。

  4. 指数增长: 退避时间指数增长,不是线性增长。

  5. 与重试配合: 应与 retry_count 配合配置。

  6. 系统保护: 适当的退避可以保护系统避免过载。

  7. 故障恢复: 退避时间过长会延迟故障恢复。

  8. 监控建议: 监控重试成功率,评估退避效果。

  9. 测试验证: 配置变更后应验证故障恢复能力。

  10. 单位换算: 确保正确理解毫秒和秒的换算。