ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

QUIC 长连接收到重复推送怎么办:连接世代、messageId 与幂等消费

QUIC 长连接收到重复推送怎么办:连接世代、messageId 与幂等消费 QUIC 长连接收到重复推送怎么办连接世代、messageId 与幂等消费手机从 Wi-Fi 切到蜂窝网络后通知列表突然多出两条相同消息日志里还能看到旧连接在新连接建立后晚到一步。QUIC 能减少握手和队头阻塞但不会替应用决定“哪条连接仍有效”和“重复业务消息能不能再次执行”。这两个边界必须由调用方自己守住。验证范围本文依据华为开发者官网截至 2026-09-22 的公开资料整理。当前本机 DevEco SDK 为 API 24且没有连接 HDC 真机涉及 API 26 的接口片段用于说明接入与排障边界不宣称已经完成 API 26 编译或真机验证。文中的时间戳校验、状态机、坐标换算、去重合并与资源预算逻辑已通过 Node.js 宿主测试正式上线仍需在 API 26 SDK 和目标设备上补齐编译、权限、异常分支与性能验收。先把误判停下来把“连接成功”当作永久状态或者认为 QUIC 传输可靠就绝不会收到重复业务消息都会把协议能力和业务语义混在一起。网络切换、进程恢复、服务端超时重试都可能形成新连接或重复推送应用应分别用连接世代隔离旧回调用 messageId 保证消费幂等。interfaceConnectionGate{generation:number;state:idle|connecting|ready}functionbeginReconnect(gate:ConnectionGate):number{gate.generation1;gate.stateconnecting;returngate.generation;}functionacceptCallback(gate:ConnectionGate,callbackGeneration:number):boolean{returngate.generationcallbackGeneration;}案例一网络切换后旧连接回调晚到每次建连先递增 generation并把这个值绑定到连接及其所有回调。回调触发时先比较当前 generation不一致就只释放旧资源不更新页面、不安排重连。这样能阻止旧连接的 close 事件把新连接重新打回 connecting。案例二服务端重试导致同一任务执行两次连接层收到消息后不要直接写数据库或触发通知。先校验 messageId在有界缓存或持久化消费表中做原子占位已存在则确认接收但跳过副作用。缓存要有容量和过期策略关键交易类消息还应由服务端提供可查询的最终状态。classMessageDedupe{privateseennewMapstring,number();accept(id:string,now:number,ttlMs300000):boolean{for(const[key,time]ofthis.seen)if(now-timettlMs)this.seen.delete(key);if(this.seen.has(id))returnfalse;this.seen.set(id,now);returntrue;}}证据怎么对齐观察项错误做法可复核做法旧连接 close立即重连并覆盖页面状态先比对连接世代重复 messageId再次执行数据库与通知原子占位后再做副作用网络频繁切换无限并发建连退避、抖动与单飞门禁进程被回收只依赖内存去重关键消息持久化消费结果为什么采用这条路径连接世代解决“谁还能说话”messageId 解决“这件事做过没有”两者不能互相替代。普通资讯可以用有界内存缓存订单、协作指令等有副作用的消息应落持久化消费表并给失败重试留下明确终态。上线前复核每次建连生成独立世代号并贯穿所有回调。重连使用指数退避和随机抖动避免惊群。消息先去重再更新状态、数据库或通知。旧连接只释放资源不反向覆盖新连接状态。覆盖 Wi-Fi/蜂窝切换、服务端重试和进程恢复。官方资料QUIC 长连接接收消息推送HarmonyOS 7 网络新能力课程HarmonyOS 26.0.0 版本说明长连接稳定不等于业务只执行一次。把连接身份和消息身份分开管理网络切换与服务端重试才不会变成用户眼里的重复操作。
返回列表