socket.io移动网络不稳定的情况server发送给client消息经常丢失,这个问题应该怎样避免
发布于 9 年前 作者 lik0914 13792 次浏览 最后一次编辑是 8 年前 来自 问答

socket.io移动网络不稳定的情况server发送给client消息经常丢失,这个问题应该怎样避免 目前在pc端,情况基本还好。 首先客户端也增加了,断线重连机制

20 回复

移动端用push notification吧。或者加一层ack,没收到就重发

@joesonw 能具体点吗, 意思, client收到消息,在通知server,这个时候,如果中间出现异常的话, 应该怎么处理呢 ack 具体是什么呢

ack 是收到后,给后台一个收据吧。不过收据发送丢失的话,后台还是要重发的。这方面应该有成熟的方案了。TCP UDP 解决的是类似的问题。

这问题我也遇到过.感觉很不可靠.

类似ack也考虑过. 我想大概流程就是推送消息给客户端, 同时服务器这边记录给客户端发了这消息,同时这个消息的状态是’未收到’,客户端收到之后,就发个东西给服务器告诉说收到,然后服务器再把刚才的记录改为已收到或者删除这个记录.最后就是服务器定时检查看有没有消息客户端未收到,有的话就重新发了. 我网上找了下没找到现成的代码(js)或工具. 同时觉得过程中可能有其它的问题需要处理,例如, 有个消息a因为离线客户端没收到,后来客户端网络好了,这时候又有消息b推送出去,客户端收到了b,过了几分钟,服务器才知道客户端没收到a,这时候才把a发出去, 结果就是客户端先收到b再收到a, 在某些业务中可能就需要更多的验证什么的. 后来我也没有写.

现在还是用原始的方式 ajax ajax定时获取新消息, socketio只用作提醒客户端有新消息,客户端自己ajax获取消息. 同时,客户端也定时ajax看看有没有新消息.

@William17 你的意思,就是推送的话,只推送状态,客户端收到新消息状态通知的话,获取消息内容的话, 利用http拉取新消息,就是 推拉结合的方式?

@lik0914 是的.我现在就是这样. 客户端也定时http请求获取新消息

@idreamshen 这个利用回调来确认,如果,任何一方中断了, 这个会引起内存溢出之类的错误吧,这个怎么处理一下呢

@leapon 服务端发出去后,客户端可能会收不到, 收不到, server现在得不到状态啊, 那应该在什么情况服务端重发呢?

@lik0914 这个怎么会有内存溢出?发送之后要设一个超时,如果规定时间内没有收到ACK,那就重发。收到了就标记为已发送。用 setTimeout 或者 setInterval 定时去做都可以的。

@lik0914 超出一个时间没收到客服端答复就再发一遍嘛. 如果担心业务顺序的问题,就实现一个队列,只有成功发送当前的消息了,再发送下一条

可以socket.io 通知 之后客户端用http请求数据

@klesh 服务端, 针对每一条消息都启动一个定时器的话, 会不会严重影响性能呢

@joesonw 嗯, 如果超时用setTimeout之类做的话, 那服务器端会有很多定时器,如果用队列控制的话, 一个连接一个定时器, 这个对服务器性能影响有多大呢,理论上

@lik0914 不会,它是把代码插入到事件机去调配的,原生实现性能应能保证。自己实现还要计算应该是较慢

来自炫酷的 CNodeMD

@klesh 意思, 很多定时器是没有问题的, 出现性能问题可能是,业务逻辑造成,比如, 超时之后做的其他处理, 可以这样理解吗?

如果需要确保可靠性,发消息前 检查链接状态,socket.conneted 未连接情况做缓存,然后对重连事件做 缓存 消息重发

这个问题的结论就是用socke.io官方的ack +计时器 去解决吗?

@vip1232 我感觉大概就是这两个方面吧, ack 告诉 client, 你的消息发成功了, 计时器,来解决, server->client的可靠性吧

回到顶部