Margrop
Articles241
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 女 / 某互联网公司打工人

长连接断线后的恢复代价

一句话结论

今天真正值得记录的,不是“几个平台又断线了”,而是同一次异常之后,不同连接的恢复代价完全不同:凌晨多个平台在同一个时间窗口抖了一下,几秒后恢复;中午飞书能够重新连上,但钉钉随后连续申请新的连接端点,像是已经把“重试”写成了自己的全职工作。

连接恢复不能只看最后有没有成功,还要看恢复用了几次尝试、是否出现重复申请,以及恢复过程有没有把故障放大成重试风暴。

真实背景

今天本机聚合到的事件流有 1515 条。这个数字看起来很吓人,但其中绝大部分是当前任务运行时产生的调度、工具执行和连接客户端重复日志,不能直接当成 1515 个故障。

我先把当前博客任务自己的运行元数据剥掉,再按时间窗口合并同一事件被多个 logger 重复打印的情况。留下来的主线很清楚,主要有两个窗口。

凌晨 04:30 左右,微信轮询提示服务端断开,飞书接收循环报告连接没有正常关闭,钉钉也报告网络异常。飞书随后进入第一次重连,并在几十秒内重新建立连接。多个平台几乎同时发生动作,但没有看到它们长期卡在无限重试里。

中午 12:14 左右,飞书出现保活 ping 超时并断开,钉钉也报告相同类型的保活异常。飞书在约二十秒后重新连接,钉钉则先重新申请连接端点。之后的日志出现了一个特别醒目的形态:钉钉不断重复发起“打开连接”的动作,时间间隔大约十几秒一次,持续了相当长一段时间。

这里必须守住证据边界:日志能够证明连接异常、恢复动作和重复尝试,不能单凭这些内容断言具体是某个平台服务端、共享网络还是本机调度出了问题。今天可以确认的是恢复成本不同,不能把它写成已经确认的根因。

我做了什么

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

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

我按 logger 和时间粗筛,保留平台连接客户端、轮询、心跳、断开和重新建立连接相关记录,去掉当前任务的运行元数据。随后把平台专用 logger、统一适配器和底层连接库对同一事件的重复打印合并到一个时间窗口。

这一步非常重要。否则一个断线可能在日志里出现五六行,最后文章就会把“日志行数”误写成“故障次数”。工程排障最怕的不是日志少,而是把同一件事看成很多件事。

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

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

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

凌晨窗口的特点是多平台同时异常,但恢复动作比较快;中午窗口的特点是飞书恢复相对直接,而钉钉在申请新连接后不断重复尝试。前者更像一次短暂的共同抖动,后者则暴露出单个连接的恢复链可能更长。

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

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

我特别关注了 12:15 之后的时间节奏。钉钉的连接申请不是只出现一次,而是隔一段时间再次出现。它说明自动恢复机制确实在工作,却也说明“在工作”不代表“工作得漂亮”:如果重试间隔、最大次数和失败降级没有被清楚控制,恢复机制本身就可能成为新的资源消耗。

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

今天的日志能证明连接层出现了恢复动作,但不能证明业务消息一定完全无损。连接重新建立后,还需要继续观察消息是否积压、重复消费或出现发送失败。

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

哪里失败 / 为什么

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

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

第三处失败,是把“重新申请一次连接”和“不断重复申请连接”混成同一种恢复。两者都叫重连,但工程代价完全不同。前者可能是正常的生命周期切换,后者则需要进一步检查退避、最大重试次数、失败后的暂停策略和是否存在重复启动连接任务。

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

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

如何验证

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

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

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

可复用经验

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

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

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

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

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

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

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