如何保证消息不丢失?

在客户端与服务器的交互过程中,特别是多个客户端需要与服务器同步时,例如游戏同屏,要保证客户端A到客户端B的消息成功发送。但是由于网络的复杂情况,可能会出现以下情况:

1)服务器崩溃,msg:N包未发出
2)网络抖动,msg:N包被网络设备丢弃

 

一般情况下,当A向服务器发送一个信息之后,只能说明A发送成功了,但是不能保证服务器一定接收到了数据。在某些情况下,可能会出现上述丢包的原因。如何保证消息不丢失呢?

 

可以采取以下方法:

1,消息确认当A向服务器发送一条消息后,等待服务器返回处理请求成功的确认,即Ack

2,服务器接收A发送的消息后,要发送给B。

3,B,接收到消息到给服务器发送一个确认的Ack.

 

但是使用这种方法也可能会有问题,比如发送端可能因为上述原因接收不到Ack的确认消息,那该如何保证消息不丢失呢?这就需要借助于超时和重传机制了。

在发送端(比如A)如果发送出去消息之后,在一段时间内没有收到消息的回复,则为重新发送一次消息。所以发送端会维护一个发送后等待Ack的队列,并配合超时机制,以记录哪些消息没有收到ack确认,以待重新发送。

上述明显存在一个问题,如果发送端发送了重复的请求该怎么办呢?这个时候就需要使用消息去重机制了。每条发送的消息,都有一个自增的消息id,同一个消息使用同一个id发送。让接收者处理重复的消息。

 

总结,一般要保证消息的可靠性传输,都会能过超时,重发,确认,去重这几个步骤。Rabbitmq有这个机制,可借助它实现部分消息的可靠传输(一般用于内网rpc)。具体的实用方法大家可以查看rabbitmq的文档。

在游戏开发中,在应该是网络通信框架的一部分,需要一个长期完善的过程,如果没有一个长时间的积累,开发出这样一套机制还是需要一定时间的。所以前期大部分团队都不怎么考虑这个问题,会留到后期优化时再处理。但是对于有经验的团队,这应该是现成的。

转载自:http://www.youxijishu.com/h-nd-149-2_323.html

更多游戏技术方面的资料请参照:游戏技术网:http://www.youxijishu.com/

转载于:https://www.cnblogs.com/youxijishu/p/6053216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值