本地 WEB 应用实时数据推送除了使用 websocket 还有其他选择吗

2020-12-01 18:55:56 +08:00
 huyudong1991

请教各位大佬一个头疼的问题,由于一些历史原因,我们公司做的测试系统是用 django 做的 web 程序,最近需要做数据实时监控,但是基于 channels 的 websocket 的数据推送延迟有 20ms,数据源的数据大概 10ms,所以推送不及时数据会堆积造成延迟,实际上浏览器和 django 都是本地运行的,想问下大佬们有没有什么途径可以避开 websocket

2906 次点击
所在节点    Python
17 条回复
JeromeCui
2020-12-01 19:24:20 +08:00
为什么会有 20ms 的延迟?
huyudong1991
2020-12-01 19:33:31 +08:00
实际测出来的调用时间,大概是 python 后端+tcp 连接的锅
DoctorCat
2020-12-01 19:47:38 +08:00
感觉可能是 websocket 使用不当造成的。如果 ws 都不行,那么基于 HTTP 就没有更好的方法了。
Austaras
2020-12-01 19:52:42 +08:00
server side event,这个麻烦
webrtc,这个更麻烦
轮询或者长链接,这个八成比 ws 延迟更高

你试试看一次发多组数据呗反正人眼看不出几十毫秒的区别
assiadamo
2020-12-01 19:56:33 +08:00
webrtc 其实还好
可不可以用一些比较轻量的队列呢?比如 mqtt
thtznet
2020-12-01 20:01:32 +08:00
SignalR 了解一下
huyudong1991
2020-12-01 20:49:01 +08:00
@thtznet 貌似兼容 ws,应该不会有本质区别吧
huyudong1991
2020-12-01 20:49:52 +08:00
@DoctorCat 不太清楚原因,回头找个干净的环境正经测一下
huyudong1991
2020-12-01 20:50:13 +08:00
@Austaras 现在确实是打算一次多发哈哈
thtznet
2020-12-01 21:04:29 +08:00
@huyudong1991 SignalR 和 我们自己实现 webrtc 的核心区别就是,微软的工程师比大部分的"我们"牛,大牛封装过的东西,可能不是最顶级的,但下限是有保证的。毕竟大部分的“我们”只是普通的工程师,混口饭吃罢了。
Bijiabo
2020-12-01 21:36:25 +08:00
我前两天也有类似的场景,间隔很巧也是 10ms 左右,看现象是浏览器接收 websocket 效率达不到这么高。特别是短时间内频繁操作。

建议楼主写个浏览器外运行的脚本来收消息看下延迟,对比一下
Austaras
2020-12-01 23:05:33 +08:00
不是,浏览器渲染一帧就要 1/60s,10 20ms 的延迟很关键吗?一般来说 100ms 一下的延迟是看都看不见的
tairan2006
2020-12-02 00:02:39 +08:00
10ms 不是应该考虑网速的影响么。。量级太低了
ahsjs
2020-12-02 09:00:06 +08:00
http2
no1xsyzy
2020-12-02 10:22:03 +08:00
让我理解下,数据流是这样的
某上游 --> 你的 Django --> 用户浏览器
上游发送数据每 10ms 发送一次
用户浏览器每 20ms 接受一次(串行)
从而导致消息在你的 Django 上积压

那么结果很明显,方法有两个:
1. 丢弃用户侧未能及时接受的数据
2. 用户侧一次发送不止一份数据

@Austaras 1/60s 不是 16ms 么?
ardenchan
2020-12-02 11:28:08 +08:00
根据楼上老哥的思路,服务器端给他睡眠个 10ms
完美解决[手动狗头]
anaf
2020-12-11 00:22:37 +08:00
sse 单项通信

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731100

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX