首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Miles Router机制深度解析:路由、健康检查与请求元数据如何无缝协同
📅 2026/9/18 2:44:57
✍️ 爱科研究院
👁 阅读 3,247
Miles Router机制深度解析路由、健康检查与请求元数据如何无缝协同【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/milesMiles是一个面向企业的 LLM/VLM 强化学习后训练框架而Miles Router正是它推理侧的请求路由网关以最少连接算法挑选推理引擎、用后台健康检查自动隔离故障 worker并在透明代理中保持请求头元数据完整。本文将带你快速读懂这套机制是如何协同工作的。先认识 Miles RouterRL 训练里的流量调度员在 RL 后训练流程中Rollout 阶段需要向大量 SGLang 推理引擎worker持续发起生成分布请求。Miles Router 就站在这条链路的入口处路由Routing每个请求落到当前最空闲的推理引擎上健康检查Health Check后台循环持续探测 worker坏掉的自动隔离元数据保持Metadata Preservation转发时保留并清洗 HTTP 头请求对 worker 完全透明组件入口在 miles/router/router.py启动参数定义在 miles/router/config.py。下面这张 Miles 整体架构图中推理引擎集群与路由层正是其核心组成部分路由机制最少连接算法如何挑 workerMiles Router 内部只维护三份极简状态# URL - 当前活跃请求数负载 self.worker_request_counts: dict[str, int] {} # URL - 连续健康检查失败次数 self.worker_failure_counts: dict[str, int] {} # 被隔离、排除出路由池的 worker self.dead_workers: set[str] set()选路逻辑见_use_url()router.py#L228-L243核心就一行url min(self.worker_request_counts, keyself.worker_request_counts.get)即用min()找出活跃请求数最少的 worker随即把计数 1。这属于最少连接Least-Connection策略——相比轮询它能天然适配推理场景下各请求耗时差异巨大的特点长文本生成占住 worker 更久短请求则快速腾出名额。配套的_finish_url()在请求结束时做计数 -1且被放在finally块中调用即使转发抛异常也保证计数回滚不会出现幽灵负载。它还处理了一个边界请求结束时 worker 恰好已被注销此时直接忽略并记一条日志避免计数变成负数。健康检查连续失败 N 次才处刑后台健康检查循环_health_check_loop()router.py#L82-L124在 FastAPI 启动钩子中被拉起工作节奏是每health_check_interval秒唤醒一次用asyncio.gather并发探测所有在册 worker 的/health端点单点超时 5 秒探测失败则累加该 worker 的失败计数一旦连续失败达到阈值默认 3 次就标记为 DEAD移出路池探测成功则把失败计数清零。这个连续失败 N 次才隔离的阈值设计很关键单次网络抖动或 worker 短暂卡顿不会造成误判连续 3 次失败才是真故障。另外DEAD worker 只会被剔除、不会被自动复活——因为重连后需要机制去同步模型版本否则旧权重会引入 off-policy 问题这一点代码里留有明确的 TODO 注释router.py#L109-L111。路由选路时也会感知隔离池池内健康则全员参与竞争存在 DEAD worker 时只从存活者中挑选若全员阵亡直接抛出No healthy workers available in the pool让上层感知故障而不是默默把流量灌给坏节点。请求元数据如何被保持透明代理的细节Router 注册了一个 catch-all 路由/{path:path}把其余一切请求generate、abort、get_model_info……全部透明转发给所选 worker。这个路由必须最后注册否则会覆盖/add_worker等管理接口。转发逻辑集中在do_proxy()与build_proxy_response()router.py#L131-L176元数据保持体现在几处精细的头处理上转发请求前剥掉content-length与transfer-encoding头——因为 body 会被原样重写保留旧长度值会与真实字节数冲突返回响应前同样剥掉content-length、transfer-encoding再剔除server、date这类会暴露内部实现的信息头JSON 感知尝试把响应体按 JSON 解析成功则用JSONResponse重建自动修正内容类型失败则按原始字节加content-type透传。请求体body与业务头则被完整保留worker 拿到的请求与直连时几乎无差——这正是透明代理的含义worker 无感知Router 只负责把流量放到最合适的地方。管理接口与关键配置项三个管理接口让 Router 具备动态扩缩能力router.py#L178-L226接口说明POST /add_worker?url...注册 worker重复注册幂等且会自动解除 DEAD 状态POST /remove_worker?url...注销 worker计数与失败记录一并清理GET /list_workers列出当前全部在册 worker配置由 Pydantic 冻结模型MilesRouterConfigconfig.py#L4-L10承载常用项在 miles/utils/arguments.py 中暴露为 CLI 参数--use-miles-router开启即使用 MilesRouter 的文本层路由替代 SGLang 官方 router 的 token 级路由--miles-router-timeout/--miles-router-max-connections控制 HTTP 客户端超时与并发上限默认按sglang_server_concurrency × 引擎数推算见 config.py#L13-L26--miles-router-health-check-failure-threshold健康检查连续失败隔离阈值默认 3。启动时 Router 以独立子进程方式拉起python -m miles.router.router见 miles/ray/specs/inference.py#L37-L42进程名设为miles-router方便pkill精确定位默认监听 8000 端口。需要注意的是它目前不支持 PD 分离Prefill/Decode Disaggregation部署形态。小结Miles Router 用不到 250 行代码把三件事做到了简单但正确✅最少连接路由min()一行选路 finally保证计数回滚负载天然均衡✅带阈值的健康检查并发探测 连续失败才隔离兼顾灵敏度与抗抖动✅透明元数据代理选择性清洗传输类头、保留业务头与 JSON 语义worker 完全无感知。如果你想继续深入建议从 miles/router/ 模块读起再对照 tests/fast/router/test_router.py 中的测试用例看看这些机制是如何被验证的。【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/18 2:44:57
ZenML Google Cloud Vertex AI Orchestrator 实战指南:从权限配置到 GPU 加速与定时调度
2026/9/18 2:39:57
自注意力与对抗机制提升深度子空间聚类鲁棒性
2026/9/18 2:39:57
Python轻量级人脸识别系统:Dlib+ResNet CPU部署实战
2026/9/18 3:19:59
代理模型双路线:工程仿真响应面与AI助手本地云端路由
2026/9/18 3:19:59
本地部署DeepSeek R1:Ollama与Cherry Studio实战指南
2026/9/18 3:19:59
跨境社媒运营的隐性协作税:用机制补足团队底层协作能力
2026/9/18 3:19:59
MySQL主键与外键:聚簇索引、约束机制与生产环境取舍
2026/9/18 3:19:59
Windows To Go与Linux To Go制作全指南:打造随身便携系统盘
2026/9/18 3:14:59
LeetCode 1750 最小删除字符数:双指针 + 贪心解法剖析(附 10 种语言实现)
2026/9/18 0:04:47
AReaL 调试指南:从 Agent Workflow 验证到分布式训练死锁诊断
2026/9/18 0:04:47
MATLAB实现GPS L1 C/A信号仿真与二维捕获验证
2026/9/18 0:04:47
彻底搞懂ASCII、Unicode与UTF-8:从乱码根源到编码实战
2026/9/16 18:36:59
拯救者Y7000黑屏故障排查与维修实战指南
2026/9/16 7:38:03
AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
2026/9/17 4:19:54
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化