当前位置: 首页 > news >正文

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)
http://www.jsqmd.com/news/363001/

相关文章:

  • winget坏了修复
  • 在算法的茧房中悬鉴:养护人叙事环与“悟空悖论”的超越
  • 成都诚信艺考美术集训机构优质推荐 - 优质品牌商家
  • 三亚平价海鲜必看!2026年度高性价比湘菜排行榜推荐
  • 9.1 WebSocket网关架构设计竟然可以这样做?
  • 2026别墅电梯优质厂家推荐榜 - 优质品牌商家
  • 折叠面板(Accordion)
  • Pandas 简介
  • 当你 push 完分支,再提 MR 时,main 已经更新了,会发生什么?
  • 《Foundation 分页》
  • 2026年别墅电梯厂家推荐:老小区旧楼加装电梯多少钱一台/4层别墅电梯一般多少钱/六层旧楼加装电梯价格/选择指南 - 优质品牌商家
  • 智能医疗 | 算法稳定性在医疗设备中的重要性
  • Java毕设项目推荐-基于springboot的软件开发项目任务跟踪系统的设计与实现基于springboot的软件协作跟踪平台的设计与开发【附源码+文档,调试定制服务】
  • Scala 运算符
  • MR(Merge Request)、PR(Pull Request)分别是什么意思?【MR = PR = 合并请求,不同平台叫法不同】
  • JSP 服务器响应
  • 从 git clone 到代码合并进 main 的完整规范流程
  • centos+python批量导出csdn里的文章
  • Oracle云平台基础设施文档-计费与成本管理篇3
  • 2026年评价高的动画制作公司推荐:医疗器械动画制作、商业航天动画制作、施工原理动画制作、施工工艺动画制作选择指南 - 优质品牌商家
  • 计算机Java毕设实战-基于springboot的软件协作跟踪平台的设计与开发软件项目进度管理系统 【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 分析分析Vue与VueComponent的关系
  • 记一次集群网络异常后节点启动失败处理情况
  • Java毕设项目:基于springboot的在线社区系统的设计与开发(源码+文档,讲解、调试运行,定制等)
  • 260209
  • 基于MATLAB开发的口罩佩戴检测系统智能化识别与监管功能强大
  • 肠道菌群防御新解:多样性驱动的营养竞争是抵抗病原体定植的核心
  • 获取java
  • 【毕业设计】基于springboot的在线社区系统的设计与开发(源码+文档+远程调试,全bao定制等)
  • Perl 子程序(函数)