[分享创造] 云手机 Relay 层里,长连接会话最容易踩坑的是哪里?

最近在整理云手机 Relay 层的一些技术细节,发现很多问题并不在“能不能把 Android 画面推出来”,而在一次会话里怎么把多条长期连接管住。 一台云端 Android 通常不止一条连接: - 视频流持续推画面; - 音频流单独走; - 客户端不断发触控、按键和输入事件; - 控制通道还要承载设...
[分享创造] 云手机 Relay 层里,长连接会话最容易踩坑的是哪里?
[分享创造] 云手机 Relay 层里,长连接会话最容易踩坑的是哪里?


一台云端 Android 通常不止一条连接:

- 视频流持续推画面;
- 音频流单独走;
- 客户端不断发触控、按键和输入事件;
- 控制通道还要承载设备状态、通知和扩展命令;
- 截图、Shell 、文件读取这类任务还需要请求和响应匹配。

如果 Relay 只把这些当成几条独立 WebSocket ,问题会很快暴露:页面刷新后旧连接怎么释放,设备重连时新流绑定到哪个会话,慢客户端会不会拖住转发路径,截图和 Shell 的返回结果会不会串线。

我现在更关注几件比较朴素的控制点:

1. 会话、设备、客户端、流之间的绑定关系要清楚;
2. 写入客户端要有 deadline ,缓冲区要有上限;
3. 控制消息需要 request id ,响应不能只按返回顺序处理;
4. 半开连接、失效路由、旧会话映射要及时清理;
5. 重连前先让状态收敛,否则重试也可能落回脏状态。

这些点不如“低延迟”听起来醒目,但实际会影响云手机是不是会卡住、串线、重连异常或者长期占资源。

这篇是从蜂壳云的一篇技术日志改写的,原文在这里:
https://www.phones-cloud.cn/blog/relay-stability-for-cloud-android

如果你们做过长连接、远程桌面、设备控制或类似的实时会话系统,Relay 层最容易踩坑的地方一般是写入背压、会话绑定,还是异常清理?
来源: v2ex查看原文