用websocket发送消息,有个比较大的疑问

Leooo

使用的是Gateway框架
用户A通过ajax发送消息到php框架,php框架调用GateWayClient向用户B发送消息
问题:
1、如果这时候用户B的网络不好,导致没有收到这条消息,过一会网络又好了,那么消息看起来就是缺失一截
2、如果使用回执,php框架向用户B发送消息,用户B收到消息后回发一条消息给服务端,那么,如果要实现消息的补发应该怎么做,难道每使用GateWayClient推送一条消息,都要做一个定时器?
 

2607 7 0
7个回答

Leooo

请教一下大家的做法

  • 暂无评论
Leooo

有人吗
 

  • 暂无评论
six

每一条消息都存在数据库里,每条消息都有个已读未读字段。
每条消息发到对方客户端后客户端给服务端发一个请求标记此消息已读。
这样就能知道哪些消息没读了,下一次登录的时候或者网络不好连接断开重连时ajax请求一遍数据库就知道哪些没读,拉过来显示就好了
 

  • 暂无评论
abcde123456

1、要发的消息加入数据库, 2、定时查询数据库并发送消息, 3、客户端收到消息后通知服务端把消息标为已读

  • 暂无评论
dignfei

消息保存到redis。
客户端断开,如果网络又好了,会触发重新连接。可以在连接时触发发送所有的未发送消息。我就是这样做的

  • Leooo 2019-09-28

    我也是用这样的方法实现的,但是写完才发现另一个致命的问题,就是GateWay的连接无法做到立马断开!比如A发消息给B,先判断B是否在线,在线就直接推,不在线就存redis,然后一上线就推,问题出在,B突然断线,而GateWay需要时间才能把B踢出在线列表

dignfei

比如A发消息给B,先判断B是否在线,在线就直接推,不在线就存redis,然后一上线就推,问题出在,B突然断线,而GateWay需要时间才能把B踢出在线列表    错误
 
应该 : 先保存到 redis 。然后推送给B,如果B收到返回信息,
a、收到B的反馈后就从redis删掉。
b、没收到反馈,重试2次,还不行则说明断线了。下次重连时再发

  • Leooo 2019-09-28

    我明白你意思了,谢谢你

kenny534

也可以使用全局变量保存每个用户的“待发消息”,收到回执后删除对应消息
每次发消息的步骤如下:
1、将最新的消息加入此队列;
2、从队列的第一条开始发送(如果收到用户的“回执”,则对应消息会被从该队列中删除);
这样可以保证消息不重复发送,也不丢失,如果有问题,再分析!

  • Leooo 2019-09-30

    目前正是这样做的,只是使用的是mysql,在尝试使用redis

  • kenny534 2019-09-30

    数据库不如内存快,多种方式都可以尝试,有时间的话,可以对比一下,哪个方式最优

年代过于久远,无法发表回答
🔝