分布式系统路由节点探活通过将各节点连通性检查封装为无状态callable任务,由动态线程池并行执行,统一捕获异常并返回布尔结果;结合invokeall超时控制、结果聚合驱动熔断或优先级路由,并辅以caffeine短时效缓存降低抖动。

在分布式系统中做路由节点探活,核心是把“每个节点的连通性检查”变成可并行、可控制、可聚合的独立任务,再用线程池统一调度。它不靠外部服务发现组件兜底,而是由业务层主动拉取健康状态,适合网关前置校验、灰度发布前预检、边缘节点心跳探测等轻量可控场景。
封装每个节点为 Callable 任务
每个路由节点对应一个 Callable 实例,构造时传入目标地址、端口、协议(HTTP/TCP)、超时时间等参数,确保无共享状态:
- call() 方法内完成实际探测:用
Socket.connect(..., timeout)或 HTTP 客户端的 connectTimeout 控制单次阻塞,避免线程卡死 - 所有底层异常(ConnectException、TimeoutException、IOException)统一捕获,返回 false,不向上抛出
- 返回 true 表示该节点网络可达、端口开放、基础服务响应正常
构建动态适配的线程池
节点列表常来自配置中心或注册中心,数量可能变化,线程池不能写死:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 使用
ThreadPoolExecutor,核心线程数设为min(8, 节点总数),最大线程数设为min(16, 节点总数) - 任务队列选用
SynchronousQueue,配合CallerRunsPolicy拒绝策略,防止任务堆积,让过载请求在调用线程中降级执行 - 提交全部 Callable 后,调用
invokeAll(tasks, 3, TimeUnit.SECONDS),总超时设为 2~5 秒,自动中断未完成任务
聚合结果驱动实时路由决策
探活不是目的,结果要立刻用于下游转发逻辑:
- 遍历
List<future>></future>,对每个 Future 调用isDone() && get()(已在 invokeAll 中保证不阻塞),收集返回 true 的节点地址 - 若存活数为 0,触发熔断:返回兜底响应、记录告警、或切换至备用集群地址池
- 若存活数 ≥2,可按探测耗时排序,生成本次请求的优先级列表,交由负载均衡器(如 Ribbon、自研 LB)使用
与本地缓存协同降低抖动
纯主动探活有毛刺风险,需搭配短时效缓存平滑体验:
- 每次探活成功后,将节点地址 + 状态写入本地 Caffeine 缓存,设置 expireAfterWrite 为 8~12 秒
- 路由时优先查缓存,缓存未命中再触发一次探活,避免高频穿透到网络层
- 缓存作为兜底视图,即使某次探活全失败,也能基于最近有效状态维持基本可用性










