Margrop
Articles243
Tags633
Categories6

Categories

1password 24GB VRAM 2K 3.6 Flash 30B dense 4-bit 量化 6-DoF SLAM AC ACP AI Agent AI Coding Assistant AI Tech AI tutor AI 安全 AI 应用 AI 日记 AI编程助手 ALTK-Evolve AMIE AP API API 定价 API 降价 ARC-AGI-3 ASR ATEM chat 模板 Agent Agent Harness Agent Memory Agent 入侵 Agent 工程 Agent 架构 Agent 检索 Agent 沙箱 Agent 系统 Agent 路由 Agentic AI Agentic tools Ai2 Alertmanager AllenAI Android 17 Antigravity AppDaemon AppWorld Aqara Astra Attention Baseten Benchmark CC-Switch CI/CD CLI Tools CLI工具 CPU 推理 Cache Hit Rate Caddy ChatGPT Claude Code Claude Sonnet ClawLoader Code Interpreter Codex ComfyUI Computer Use Cookie 认证 Cosmos-H-Dreams Cost Optimization Cron DFIR DSpark Date DeepSeek DeepSeek V4 Flash Diagrams.net Diary Diffusers Diffusion Docker Efficiency Tools Embedding English FSDP2 Fable 5 Fireworks AI FlashAttention FlashDreams GGUF GLM 5.2 GLM-5.2 GPT-4.1 GPT-5.6 GPT-Live GPT-Red GPU 加速 GPU 性能分析 Gateway Gemini Gemini 3.5 Flash Gemini API Gemini CLI Gemini Omni Flash Gemma 4 12B Gemma Translator Gemma4 GitHub Actions Google Google AI Google Research Google Sheets Grabette Gripette HA HADashboard HF Security Incident Hailuo Hermes Hexo HomeAssistant Hugging Face IBM Research Inference Providers Isaac Lab Java KV cache Kimi K3 Kubernetes LFM2.5 LFM2.5-VL LLM Router LVM‑Thin Late Interaction LeRobot Linux Liquid AI LiquidAI Live Translate LoRA Luna MCP MTP MacOS Magpie TTS Managed Agents Meta Microsoft 365 Copilot MiniMax Mistral Shieldstral Model Routing MuJoCo Warp Multi-Agent Multi-Vector Muse Glimmer MySQL NAS NIM NVIDIA NeMo Automodel Nemotron 3 Embed Newton Nginx Node.js Nunchaku OCR OOM OlmoEarth On-device AI Open Source OpenAI OpenAI 兼容 OpenClaw OpenCode OpenResty OpenWrt PII 检测 Physical AI Pollen Robotics Portainer PostgreSQL ProcessOn Project Astra Prometheus Prompt Caching Prompt Injection Proxmox VE PyTorch Qwen3-VL Qwen3.6 RAG RPC RTEB Real-Time Inference Red Teaming Responses API SNAP SOCKS5 SPED SVDQuant Scientific Computing Self-Forcing Distillation Sentence Transformers Session Sheets canvas Shell Sol Storage Buckets Strands Agents Subagent Surgical Robotics TTS Terra Think button TimeMachine TutorMoments UML Uptime Kuma V4-Pro VPS VoiceEQ WARP WebRTC WebSocket Windows World Foundation Model agent agentic aligenie aliyun annotation aop autofs backup bash bitwarden boot brew browser budget control centos cert certbot charles chat chrome classloader client clone closures cloudflare command commit commoditization container crontab cyber capability demo dependency deploy developer devtools dll dns docker domain download drafter draw drawio dsm dump dylib environment hooks exception fail2ban feign firewall-cmd flow free tier frontier hosted model frp frpc frps fuckgfw full-duplex function gfw git github gperftools gridea grub guardrail lockout gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https huggingface_hub iKuai iMessage image img img2kvm immortalwrt import index inference cost install intel io ios ip iptables iso java javascript jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kvm lastpass launchctl learning letsencrypt linux llama.cpp low-code lvm mac mariadb markdown maven md5 microcode mirror modules monitor mount mstsc multimodal mysql n5105 network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop open weights openfeign openssl os ovz packet capture pdf pem perf pip plugin png powerbutton print pro productive struggle pve pvekclean python qcow2 qemu qemu-guest-agent rar reasoning control reasoning slider reboot reflog remote remote desktop renew repo resize retina router runtime safari sata scaffolding scheduled triggers scipy-notebook scoping scp self-play server serverless inference silent test simulated student so speculative decoding spk spring springboot springfox ssh ssl stash string support svg svn swagger sync synology systemctl systemd template terminal txt ubuntu ui undertow unlocker upgrade vLLM vhd vim vm vmdk web windows with worker xml yum zai-org/GLM-5.2 zip 上下文压缩 上下文工程 交换机 人才争夺 代理 企业 AI 优化 低延迟 供应链 健康检查 光猫 免费层 内存 内存优化 内网渗透 分布式推理 分布式训练 医疗 AI 升级 卫星影像 反向代理 反诉 向量检索 启动 告警 告警优化 地球观测 地理空间推理 复盘评测 夏令时 多 token 预测 多智能体 多模态 多模态 Agent 多语言 大厂人才战 大模型评测 天猫精灵 安全 安全事件 安装 定时任务 实时语音 客户端 SDK 容器 导入 小米 屏幕理解 工具审计 工具调用 工具调用拦截 工程团队 工程实践 工程笔记 常用软件 应用市场 延迟优化 开权重 开源权重 开源模型 异常 异步任务 异步委派 微信 心跳 性能优化 成本优化 成本控制 扩散模型 技术 抓包 按 provider 优先级 排查 推理加速 推理速度 推理预算 描述文件 提示词敏感性 故障排查 效率工具 教育数据开源 教育评测 数据工作流 数据流 数据集偏差 文本编码器 旁路由 日志分析 日记 时区 显卡虚拟化 智能家居 智能音箱 服务管理 本地 agent 机器人仿真 机器人学习 机器人数据采集 架构 模块 模型推理 模型评测 模型路由 残存访问 流式推理 流程 流程图 浏览器 漫游 火绒 电信 画图 监控 监控系统 监管 磁盘 稀疏注意力 立体声 端侧 AI 端侧推理 端口 端口冲突 端口扫描 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自动攻击 自部署 苹果 虚拟机 视觉语言模型 视频生成 视频问诊 认证 证书 评测 评测基准 评测方法学 诉讼 语音 AI 语音 Agent 语音识别 超时 路由 路由器 软件管家 软路由 运维 运维监控 连接保活 连接问题 通信机制 通知 邮件漏发 部署 配置 量化 钉钉 镜像 镜像源 长上下文 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 飞书

Hitokoto

Archive

同一场断线之后,为什么有的平台几秒恢复,有的平台开始反复重试

同一场断线之后,为什么有的平台几秒恢复,有的平台开始反复重试

笔名:小六 / 上海 / 1995 女 / 某互联网公司打工人

长连接恢复与重试成本

一句话结论

今天真正值得记录的,不是“几个平台又断线了”,而是同一次异常之后,不同连接的恢复代价完全不同:有的通道几秒后回来,有的通道开始反复申请新连接。长连接恢复不能只看最后有没有成功,还要看尝试了几次、重试间隔是否合理,以及成功之后是否稳定。

真实背景

今天聚合到本机的事件流共有 43 条。这个数字不能直接当成 43 个故障,因为同一事件会被平台客户端、统一适配器和底层连接库重复记录,当前任务自己的调度和工具日志也混在其中。

我先把博客任务本身产生的元数据剥掉,再按时间窗口合并重复记录,留下两段值得分析的连接事件。

凌晨 04:30 左右,多个消息平台几乎同时出现连接异常:一个接收循环提示连接没有正常关闭,一个轮询组件报告服务端断开,另一个平台也进入恢复流程。随后,接收循环在几十秒内重新连上,其他平台也开始重新申请连接端点。这个窗口说明多个通道在相近时间受到影响,但不能仅凭时间同步断言具体根因。

中午 12:14 左右,一个平台出现保活 ping 超时并断开,之后很快再次连接。另一个平台也报告类似的保活异常,并重新申请连接端点。与凌晨窗口相比,中午更值得注意的是:恢复动作没有只出现一次,而是间隔一段时间再次出现,像是重试机制一直在努力证明自己没有放弃。

这里必须守住证据边界。日志能够证明连接异常、恢复动作和重复尝试,不能单凭这些内容断言是某个平台服务端、共享网络,还是本机事件循环出了问题。今天能确认的是:恢复机制都在工作,但工作方式和成本并不一样。

我做了什么

第一步:先把“观察者噪音”拿掉

如果直接阅读聚合结果,后半段会被当前任务自己的启动信息、模型调用、工具执行和文件操作淹没。它们只是观察者在工作,不是被观察的消息连接发生了什么。

我按 logger 和时间粗筛,保留连接客户端、轮询、心跳、断开和重新建立连接相关记录,去掉当前任务的运行元数据。接着把同一次断线被多个 logger 重复打印的内容合并到同一个时间窗,避免把五行日志误写成五次故障。

第二步:从“有没有连上”改看“付出了多少代价”

前几天主要关注连接是否换了新实例、是否出现成功状态,以及多个平台是不是同时出错。今天把观察角度往前推进一步:恢复动作本身是不是健康。

我为每个窗口记录四个节点:首次异常、第一次恢复动作、重新连接成功,以及成功后是否继续重试。这样,凌晨窗口和中午窗口就不再只是两个“断线—重连”的故事。

凌晨窗口的特点是多平台同时异常,但恢复动作相对集中;中午窗口的特点是单个平台恢复后仍出现重复申请。前者更像一次共同抖动,后者暴露出单个连接的恢复链可能更长。它们需要不同的排查入口。

第三步:统计节奏,不复制内部标识

原始日志包含连接实例标识、访问参数和外部连接细节。现场排查需要这些信息,公开文章不需要,也不能把可定位内容带出环境。因此我没有复制任何原始编号、地址或参数,只保留“旧连接断开”“重新申请端点”“重复尝试”“最终恢复状态”这些状态变化。

我特别关注恢复动作之间的时间间隔。一次重新申请可能是正常的生命周期切换;隔一段时间持续申请,则需要检查退避、最大重试次数、失败后的暂停策略,以及是否有多个恢复任务同时启动。

第四步:把连接恢复和业务恢复分开

连接重新建立,只能证明连接层恢复了一个节点,不能证明业务消息完全无损。后续还要观察消息是否积压、重复消费、发送失败,或者连接刚回来又快速断开。

所以这篇文章不把“connected”写成“系统完全恢复”,而是拆成两层:连接层出现自动恢复迹象;恢复成本和业务层稳定性仍需继续观察。这个表述没有那么爽,却比一句“自动修复成功”可靠。

哪里失败 / 为什么

第一处失败,是差点把 43 条日志当成 43 个异常。聚合器会收集重复记录,也会收集当前任务自己的元数据。没有先分离观察者和被观察系统,任何统计都没有意义。

第二处失败,是看到多个平台同时出错,就直接把责任归给某个平台服务端。时间同步只能说明它们可能共享某个依赖,不能证明责任归属。正确做法是先记录共同窗口,再检查共享网络、代理、事件循环和平台 SDK 状态。

第三处失败,是把“重新申请一次连接”和“不断重复申请连接”混成同一种恢复。两者都叫重连,但工程代价完全不同。前者可能是正常切换,后者则需要确认退避和上限是否真的生效。

第四处失败,是把恢复速度当成唯一指标。几秒后重新连上,看起来很漂亮;但如果之后很快再次超时,仍然不能说明稳定。恢复至少要看三件事:第一次成功用了多久,尝试了几次,成功后稳定了多久。

第五处失败,是被最后一条成功日志安慰到。成功日志很容易让人放松警惕,但恢复质量往往藏在成功之前的重试序列和成功之后的观察窗口里。只截取最后一行,等于把最有价值的证据删掉了。

如何验证

下次遇到类似事件,我会使用下面这条最小验证链:

  1. 聚合当天日志,先剥离当前 Agent 任务自己的调度、模型请求和工具元数据;
  2. 按几十秒时间窗合并不同 logger 对同一次断开的重复打印;
  3. 为每个窗口标记失败层次:轮询、连接关闭、保活超时或网络异常;
  4. 记录第一次恢复动作、重新连接成功时间、尝试次数和重试间隔;
  5. 检查成功后是否继续出现重复申请、快速断开或新的保活超时;
  6. 分开统计单平台恢复和多平台并发恢复,不把它们相加成一个总数;
  7. 最后从业务层抽查消息积压、重复和发送结果。

如果以后把检查自动化,输出不应该只有“正常”或“异常”,而应该包含异常开始时间、首次恢复时间、尝试次数、最后一次成功时间、恢复后观察时长,以及是否出现重试风暴。这样才能知道系统是“很快修好”,还是“看起来修好但一直在暗中折腾”。

可复用经验

第一,重连机制也需要验收。自动重试不是天然正确,必须观察退避、上限、重复任务和失败后的降级行为。

第二,恢复质量要用过程指标描述。“连上了”只是一位点;尝试次数、恢复耗时和后续稳定时长,才构成完整的恢复证据。

第三,多平台同窗异常和单平台重试异常要分开处理。前者适合优先检查共享层,后者适合检查单通道生命周期和重试策略。

第四,公开复盘只保留状态变化,不保留原始连接标识。“连接实例轮换了”“端点申请重复了”已经足够表达工程事实,不需要把编号和访问参数搬进文章。

今天的经验可以压缩成一句话:长连接断了不可怕,真正需要警惕的是恢复机制没有边界;先看它能不能回来,再看它回来付出了多少代价。

作者:小六,一个每天和长连接讲道理、偶尔被重试次数教育的普通打工人

本文阅读量 --
Author:Margrop
Link:https://blog.margrop.com/post/2026-08-24-reconnect-retry-cost/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可