news 2026/9/8 14:38:42

10.1 重大发现!消息可靠传输原来是这样保证的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10.1 重大发现!消息可靠传输原来是这样保证的?

重大发现!消息可靠传输原来是这样保证的?

在WebSocket网关中,确保消息的可靠传输是至关重要的。网络不稳定、客户端断线、服务器故障等因素都可能导致消息丢失。本章将深入探讨如何通过多种技术手段保证消息的可靠传输。

1. 消息可靠传输挑战

在实时通信系统中,确保消息可靠传输面临诸多挑战:

1.1 问题分析

// ReliabilityChallenges 可靠性挑战typeReliabilityChallengesstruct{// 网络不稳定性NetworkInstabilitybool// 客户端断线ClientDisconnectionbool// 服务器故障ServerFailurebool// 消息重复MessageDuplicationbool// 消息乱序MessageReorderingbool// 消息丢失MessageLossbool}

1.2 可靠传输要求

// ReliabilityRequirements 可靠性要求typeReliabilityRequirementsstruct{// 至少一次传递 (At-least-once)AtLeastOncebool// 至多一次传递 (At-most-once)AtMostOncebool// 精确一次传递 (Exactly-once)ExactlyOncebool// 消息顺序保证MessageOrderingbool}

2. 消息确认机制

消息确认机制是保证消息可靠传输的基础。

2.1 确认消息设计

// Acknowledgment 确认消息typeAcknowledgmentstruct{// 确认的消息IDMessageIDstring`json:"message_id"`// 确认类型Typestring`json:"type"`// 确认时间戳Timestamp time.Time`json:"timestamp"`// 确认状态Statusstring`json:"status"`// 错误信息(如果有的话)Errorstring`json:"error,omitempty"`}// AckType 确认类型常量const(AckTypeReceived="received"// 已接收AckTypeProcessed="processed"// 已处理AckTypeFailed="failed"// 处理失败)// AckStatus 确认状态常量const(AckStatusSuccess="success"AckStatusFailure="failure")// MessageWithAck 带确认机制的消息typeMessageWithAckstruct{GenericMessage// 是否需要确认RequireAckbool`json:"require_ack"`// 确认超时时间AckTimeout time.Duration`json:"ack_timeout"`// 重试次数RetryCountint`json:"retry_count"`}

2.2 确认管理器

// AckManager 确认管理器typeAckManagerstruct{// 待确认消息映射pendingMessages sync.Map// map[string]*PendingMessage// 确认超时检查间隔checkInterval time.Duration// 最大重试次数maxRetriesint// 消息存储(用于重发)messageStore MessageStore}// PendingMessage 待确认消息typePendingMessagestruct{Message*MessageWithAck SentAt time.Time RetriesintAckChanchan*Acknowledgment mutex sync.RWMutex}// MessageStore 消息存储接口typeMessageStoreinterface{SaveMessage(ctx context.Context,msg*MessageWithAck)errorGetMessage(ctx context.Context,messageIDstring)(*MessageWithAck,error)DeleteMessage(ctx context.Context,messageIDstring)errorGetUnacknowledgedMessages(ctx context.Context,before time.Time)([]*MessageWithAck,error)}// NewAckManager 创建确认管理器funcNewAckManager(checkInterval time.Duration,maxRetriesint,messageStore MessageStore)*AckManager{return&AckManager{checkInterval:checkInterval,maxRetries:maxRetries,messageStore:messageStore,}}// SendMessage 发送需要确认的消息func(am*AckManager)SendMessage(ctx context.Context,conn*WebSocketConnection,msg*MessageWithAck)error{if!msg.RequireAck{// 不需要确认,直接发送data,err:=json.Marshal(msg.GenericMessage)iferr!=nil{returnfmt.Errorf("failed to marshal message: %w",err)}select{caseconn.SendChan<-data:case<-time.After(5*time.Second):returnerrors.New("send timeout")}returnnil}// 需要确认的消息pending:=&PendingMessage{Message:msg,SentAt:time.Now(),AckChan:make(chan*Acknowledgment,1),}am.pendingMessages.Store(msg.ID,pending)// 保存消息用于重发iferr:=am.messageStore.SaveMessage(ctx,msg);err!=nil{am.pendingMessages.Delete(msg.ID)returnfmt.Errorf("failed to save message: %w",err)}// 发送消息data,err:=json.Marshal(msg)iferr!=nil{am.pendingMessages.Delete(msg.ID)returnfmt.Errorf("failed to marshal message: %w",err)}select{caseconn.SendChan<-data:case<-time.After(5*time.Second):am.pendingMessages.Delete(msg.ID)returnerrors.New("send timeout")}// 等待确认select{caseack:=<-pending.AckChan:ifack.Status==AckStatusSuccess{// 确认成功,删除消息am.pendingMessages.Delete(msg.ID)am.messageStore.DeleteMessage(ctx,msg.ID)returnnil}else{returnfmt.Errorf("message processing failed: %s",ack.Error)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:54:18

Spring Boot 3 步完成日志脱敏,简单实用~

在我们写代码的时候&#xff0c;会书写许多日志代码&#xff0c;但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多&#xff0c;常见的有&#xff1a;①使用conversionRule标签&#xff0c;继承MessageConverter ②书写一个脱敏工具类&#xff0c;在打印日志…

作者头像 李华
网站建设 2026/9/7 4:37:10

12.2 太牛了!批量传输技术竟然还能这样用?

太牛了!批量传输技术竟然还能这样用? 在WebSocket网关中,批量传输技术是提升系统吞吐量和降低网络开销的重要手段。通过将多个小消息合并为一个大消息进行传输,可以显著减少网络交互次数,提高传输效率。本章将深入探讨批量传输技术的实现原理和应用场景。 1. 批量传输概…

作者头像 李华
网站建设 2026/8/25 14:11:14

Spring AI Embedding 实战:从语义搜索到商品推荐系统

Spring AI Embedding 实战:从语义搜索到商品推荐系统 关键词:Spring AI / Embedding / 向量数据库 / PGVector / 推荐系统 / RAG 一、什么是 Spring AI Embedding Spring AI 中的 Embedding 技术核心在于将文本、图像等非结构化数据转化为高维向量(即 Embedding)。这些向量…

作者头像 李华
网站建设 2026/8/22 13:14:55

16.1 批量任务调度和心跳优化竟然还能这样做?

16.1 太震撼了!批量任务调度和心跳优化竟然还能这样做? 在分布式任务调度系统中,性能优化是确保系统能够处理大规模任务的关键。今天我们将深入探讨批量任务调度和心跳优化技术,这些技术能够显著提升系统的吞吐量和响应速度。 批量任务调度机制 批量任务调度是提升系统性…

作者头像 李华
网站建设 2026/8/29 1:01:27

java juc 01 进程与线程

进程和线程的概念 并行和并发的概念 线程基本应用ps &#xff1a;随便写写&#xff0c;今天就是开个新章对比维度进程&#xff08;Process&#xff09;线程&#xff08;Thread&#xff09;基本概念程序运行时的一个实例&#xff0c;用来加载指令、管理内存、管理 IO进程内部的一…

作者头像 李华
网站建设 2026/9/3 3:41:30

Ella陈嘉桦「艾拉主意」巡演南宁站两晚连唱 现场嗦粉打造出圈名场面

Ella 陈嘉桦「It’s Me 艾拉主意」巡演继长沙、杭州、广州、上海站后&#xff0c;持续保持场场秒罄、口碑爆棚的火爆势头。2026年2月7日至8日&#xff0c;这场音乐盛宴落地绿城南宁&#xff0c;于广西体育中心体育馆一连两晚盛大开唱。其中2月8日场是整轮巡演中的第十场演出&am…

作者头像 李华