把「发送成功」当「送达」?我排查 IM 长消息被静默吞掉的完整过程

把「发送成功」当「送达」?我排查 IM 长消息被静默吞掉的完整过程

做无人值守内容矩阵时,我遇到一个非常隐蔽的坑:Agent 定时推送 IM 消息,日志里 rc=0 全是绿灯,可实际一条都没送达,服务端静默吞掉了。这篇文章记录完整排查过程,给同样跑自动化推送的人一个参考。

现象

某天早上看后台,日志一片绿:

ini 复制代码
2026-10-18 03:12:44 [INFO] push msg #1201 -> rc=0
2026-10-18 03:12:44 [INFO] push msg #1202 -> rc=0
2026-10-18 03:12:44 [INFO] push msg #1203 -> rc=0

rc=0 通常代表成功,但客户反馈一条都没收到。这是典型的「假成功」。

排查路径

1. 先排除网络层

检查了出网、连接池、重试次数,全部正常,排除网络抖动。

2. 对比「发送数」与「送达数」

这是关键一步。我把推送任务里记录的 sent_count 和 IM 服务端回执里的 delivered_count 拉出来对比:

python 复制代码
# 伪代码示意
for task in tasks:
    sent = task.sent_count          # 我这边记的
    delivered = task.delivered_count  # 服务端回执
    if sent != delivered:
        logger.warning(f"task={task.id} sent={sent} delivered={delivered}")

一跑,发现 sent=3 delivered=0,问题锁定在服务端丢弃,而非网络。

3. 定位到「长消息被吞」

逐条对比后发现,被吞的全是超长消息(单条几万字)。IM 服务端对单条消息有长度上限,超限的直接静默丢弃,不返回错误码。

验证:把一条超长消息拆成 10 条短消息,全部送达。

解决方案

按长度拆包发送

python 复制代码
MAX_LEN = 4000  # 服务端单条上限,按你对接的 IM 调整

def chunk_text(text: str, limit: int = MAX_LEN):
    return [text[i:i+limit] for i in range(0, len(text), limit)]

for chunk in chunk_text(long_text):
    push(chunk)

加「看门狗」对账

发完不是结束,起一个对账任务核对发送数与送达数,对不上就告警:

python 复制代码
def watchdog():
    for task in tasks:
        if task.sent_count != task.delivered_count:
            alert(f"静默丢失: task={task.id}")

教训

  • rc=0 只代表「发出去了」,不代表「送达了」。自动化推送必须核对底层回执。
  • 长消息是静默丢弃的高发区,务必按长度拆包。
  • 无人值守系统里,「静默」比「报错」更可怕------报错能触发告警,静默只能靠对账兜底。

这套「拆包 + 对账看门狗」已经跑进我的矩阵,从「半夜静默」变成「半夜被吵醒但至少知道」。希望对你有用。

相关推荐
mCell3 小时前
AI 时代,我为什么开始追求 100% 的测试覆盖率?
llm·ai编程·测试
ZzT3 小时前
AI-SDLC 实践 04|方案设计:把 Spec 转化为技术方案,并拆解为多 SubAgent 可执行的任务
ai编程·claude
橙橙笔记4 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事4 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖7 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks7 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
FPGA小迷弟7 小时前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga