分布式系统探活通过多态封装http/tcp/grpc等协议探测逻辑,统一healthchecker接口并由工厂按protocol动态创建实例,线程池并发执行callable任务,结果聚合驱动路由决策,并结合缓存降低网络抖动。

在分布式系统探活中,用对象多态编排多路由节点的并行探活,核心是把不同协议、不同探测逻辑的节点健康检查,统一成可替换、可扩展、可调度的接口行为,再结合线程池并发执行。它不是靠硬编码判断类型,而是让每种节点自己决定“怎么活”——HTTP 节点走 HTTP 探测,TCP 节点走 Socket 连接,gRPC 节点走 HealthCheck RPC,彼此隔离又协同。
用多态封装探测逻辑,避免 if-else 分支爆炸
每个路由节点对应一个具体实现类,都继承自同一个抽象探测器接口(如 HealthChecker),各自重写 probe() 方法:
-
HttpHealthChecker:构造时传入 URL,用HttpClient发起带超时的 HEAD/GET 请求 -
TcpHealthChecker:构造时传入 host/port,调用Socket.connect(addr, timeout) -
GrpcHealthChecker:构造时传入 target 和 channel,调用HealthClient.check() -
CustomScriptHealthChecker:支持执行本地脚本或调用 shell 命令(适合边缘设备)
所有子类保持无状态、无共享成员变量,确保线程安全;构造参数只含必要配置(地址、超时、重试次数等),不依赖外部上下文。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
用工厂+策略组合动态生成探测任务
节点元数据(来自注册中心或配置)中携带 protocol: http、port: 8080、timeout: 2000 等字段,启动时由 HealthCheckerFactory 根据 protocol 字段选择对应实现类,创建实例并包装为 Callable<boolean></boolean>:
Callable<boolean> task = () -> {
try {
return checker.probe(); // 多态调用,实际执行子类逻辑
} catch (Exception e) {
log.warn("Probe failed for {} : {}", checker.id(), e.getMessage());
return false;
}
};</boolean>
线程池统一调度,结果聚合驱动路由决策
将全部 Callable<boolean></boolean> 提交至动态线程池(如 ThreadPoolExecutor),用 invokeAll(tasks, 3, TimeUnit.SECONDS) 控制总耗时:
- 每个 Future 返回布尔值,true 表示该节点当前可达
- 遍历结果,收集
true对应的节点地址,构建可用节点列表 - 若全失败,触发熔断(返回兜底响应、记录告警、降级到备用集群)
- 若部分存活,按探测耗时排序,生成本次请求的优先级路由链
配合本地缓存降低多态调用抖动
每次 probe() 成功后,将节点 ID + true 写入 Caffeine 缓存(expireAfterWrite(10, TimeUnit.SECONDS));下次路由前先查缓存,命中则跳过探测,未命中再触发多态 probe。这样既保留多态灵活性,又避免高频网络穿透。
本质上,多态在这里不是炫技,而是把“探测方式差异”从控制流(if/switch)下沉到数据结构(类继承),让新增协议只需加一个类、注册一个 factory 映射,无需改调度主逻辑。










