首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket push确认送达的问题
### 问题描述 1. A给B发送消息,当B非正常掉线(开启飞行模式,关闭网络等),服务器进行push的时候返回的还是true,但是实际B已经掉线了。 2.使用心跳检测,也无法立即知道B掉线了。 3.因为push到socket缓存区,就相当于成功, 但并不知道socket缓存区里的消息是否有推送成功 ### 你期待的结果是什么?实际看到的错误信息又是什么? 以上问题,有什么好的解决办法,可以监测到缓存区的信息有发送成功, 1. 同步方式效率太低,会阻塞 2. 如果使用客户端回执的方式,但是回执也会出现服务器接收不到的情况。 还有其他方案么
发布于4年前 · 1 次浏览 · 来自
提问
zzzzzz1
### 问题描述 1. A给B发送消息,当B非正常掉线(开启飞行模式,关闭网络等),服务器进行push的时候返回的还是true,但是实际B已经掉线了。 2.使用心跳检测,也无法立即知道B掉线了。 3.因为push到socket缓存区,就相当于成功, 但并不知道socket缓存区里的消息是否有推送成功 ### 你期待的结果是什么?实际看到的错误信息又是什么? 以上问题,有什么好的解决办法,可以监测到缓存区的信息有发送成功, 1. 同步方式效率太低,会阻塞 2. 如果使用客户端回执的方式,但是回执也会出现服务器接收不到的情况。 还有其他方案么
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-11-11
鲁飞
https://wenda.swoole.com/detail/107609 https://github.com/swoole/swoole-src/issues/3831#issuecomment-725096134
赞
0
回复
2020-11-12
xiaowang123
应该没有方法可以**立马**知道对端断网了。因为在断网的情况下,对端是没法告诉你它断网了,只能够你这边去测试对端是否断网。那么既然是你这端测试,就必然需要走网络,那一定会需要时间的。
赞
0
回复
2020-11-15
石头
可以将这里的问题分两方面来讲 1. `TCP`本身,由于`TCP`是一个全双工的协议,一端主动断开连接发送`FIN`包,另一端是可以发送内容,并且处于`CLOSE_WAIT`状态;或者链路异常,发送方是无法感知的,所以单纯的靠调用系统调用成功并不能判断连接是否正常,可以通过`TCP`本身的`keepalive`机制,或者应用层的`keepalive`机制来保障业务的`长连接`的特性。 2. 应用层的消息强一致性,也是常见消息服务的做法。常见的办法有下列几项: * 发送的消息都会有一个确认机制,即应用层的`ack`,如果没有收到`ack`,需要根据业务情况按照一定策略进行重发,也就是说没收收到`ack`,发送发可以认为对端没有收到 * 紧接着上一条,如果是对端回复`ack`的过程中,链路发生问题,可能会导致一条消息重复发送,所以这里一般需要端上的去重和排序能力 * 另外一个常见做法是一个会话中会有消息id和消息序列号,来保证消息的全局唯一性和会话每条消息的顺序性,再结合服务端推和客户端拉的方式,来保证消息的强一致性。
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。