136、通知与指示混用时数据丢失的原因
发布时间:2026/10/23 8:56:01 锦皓数字建站

一个让我熬到凌晨三点的现场前年做的一个分布式采集项目,二十几个采集节点,通过一个中间层往主控服务汇总数据。上线跑了一周都挺正常,第七天晚上开始,主控那边偶尔少收几个批次的数据。不是每次都少,大概跑几百个批次丢一两个。重启一下中间层,能好一阵,过几个小时又开始丢。最要命的是日志。采集节点那边显示"发送成功",主控那边压根没收到。中间层的日志里,那个时间段只有一行轻飘飘的"连接已就绪"。查了两天,抓包、加日志、看内核参数,最后定位到一个很不起眼的地方——同一个连接上,通知消息和指示消息混着用,缓冲区水位一上来,通知就把后面的指示挤掉了。这个坑值得单独拎出来讲,因为公开资料里要么只讲协议字段,要么只讲API怎么调,很少有人把"混用会丢数据"这条工程红线说透。先把两个词说清楚,但不说定义我不喜欢先甩定义。你只需要记住一个画面:通知:发送方喊一嗓子,接收方听没听见、听没听全,发送方不管,也不等回执。发完就继续干自己的事。指示:发送方递一个包裹,必须等接收方签收,签收完才递下一个。中间要是没签收,发送方就卡在那儿等。这两个东西在协议栈里走的是同一条管道。问题就出在"同一条管道"上。混用的那一刻,管道里发生了什么假设你有一个发送队列,底层是一条有序的字节流通道。你先后往里塞了三条消息:[通知A] [指示B] [通知C]发送方把这三条按
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。