探针实现最佳实践

健康检查探针的实现有一些最佳实践,可以避免常见问题。

探针实现检查清单

# 探针实现检查清单
probe_checklist:
  - 检查不应阻塞太久(< 1 秒)
  - 检查不应消耗太多资源
  - 检查路径应该是幂等的
  - 检查应该快速失败
  - 检查结果应该缓存

最佳实践

1. 轻量级检查

LightweightProbe.java
@RestController
@RequestMapping("/health")
public class LightweightHealthController {

    // 检查应该只是读取状态,不要执行复杂逻辑
    @GetMapping("/live")
    public ResponseEntity<String> liveness() {
        return ResponseEntity.ok("OK");
    }

    @GetMapping("/ready")
    public ResponseEntity<HealthStatus> readiness() {
        HealthStatus status = new HealthStatus();

        // 只检查状态标志位,不实际查询
        status.setDatabase(dbHealthy.get());
        status.setCache(cacheHealthy.get());

        if (status.isHealthy()) {
            return ResponseEntity.ok(status);
        }
        return ResponseEntity.status(503).body(status);
    }
}

2. 缓存检查结果

CachedHealthCheck.java
@Service
public class CachedHealthCheck {

    private final AtomicReference<HealthStatus> cachedStatus = new AtomicReference<>();
    private volatile long lastCheckTime = 0;
    private static final long CACHE_TTL_MS = 5000;

    public HealthStatus getStatus() {
        long now = System.currentTimeMillis();
        if (now - lastCheckTime > CACHE_TTL_MS) {
            refreshStatus();
        }
        return cachedStatus.get();
    }

    private void refreshStatus() {
        // 实际检查逻辑
        // ...
        lastCheckTime = System.currentTimeMillis();
    }
}

3. 独立端口

dedicated-port.yaml
# 健康检查使用独立端口,避免主端口负载影响检查
containers:
- name: myapp
  ports:
  - containerPort: 8080
  - containerPort: 8081  # 健康检查专用

本章总结

核心要点

  1. 探针要轻量快速:不执行复杂逻辑
  2. 缓存检查结果:避免频繁检查
  3. 使用独立端口:避免相互影响