节流websocket连接的首选方法是什么?

2024-04-28 10:17:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个web应用程序,我在chrome客户端将模型更改流式传输到主干集合。有一些主干视图可能呈现或不呈现页面的某些部分,这取决于更新的类型和正在查看的内容。例如,对模型所做的某些更改会导致集合的视图被重新呈现,并且可能存在正在更新的模型的“详细信息”面板视图,也可能没有打开。由于服务器端工作流涉及到对模型的非常详细和快速的更改,所以这些模型更改可能非常快。在

问题是:在向客户机发送消息时,我在web服务器的进程中收到大量errno 32管道断开的消息,尽管websocket连接仍在运行,并且其readyState仍然为1(打开)。在

我怀疑的是,到下一条消息传入时,onmessage回调中的各种视图尚未完成呈现。这些回溯仍然可以在连接后更新。在

如果我将eventlet.sleep(0.02)放入从消息队列中读取模型更改并将其发送到websocket的循环中,则断开的管道消息将消失,但是这不是一个真正的解决方案,感觉像是一个讨厌的黑客攻击。在

websocket的onmessage函数试图做太多的工作,但下一条消息进来时仍然很忙,有没有人有类似的问题?有人有办法吗?在


Tags: 模型视图web应用程序消息客户端类型管道
1条回答
网友
1楼 · 发布于 2024-04-28 10:17:02

我认为最有效的方法是让客户端应用程序告诉服务器他们正在显示什么。服务器会对此进行跟踪,并只将更改发送到当前查看的对象,而只发送到相关的客户端。在

一种方法是使用“谁看什么”的项目列表。 项目有两种索引方式。在每个数据对象中都有一个isVievedBy链表(我知道将它与数据混合看起来并不干净,但它非常高效)。 您还需要每个数据对象的lastupdate时间戳。在

当客户机更改视图时,它会向服务器发送一条“我正在查看这个,我有版本时间戳”消息。服务器检查时间戳并在需要时发回对象。它还删除了过时的“Who-Watch-What”(通过客户端ID访问它们)项,并创建新的项。在

更新数据对象时,循环访问该对象的isVievedBy链表,以知道应该更新哪个客户端。将它放入每个客户机的消息缓冲区中,并手动刷新这些缓冲区(如果同时更新多个项目,它将发送一条大消息)。在

这是很多工作,但你的应用程序将是高效和优雅的规模,即使有很多对象和许多客户端。它只发送有用的信息,不太可能有太多的信息。在

对于您的onMessage问题,我将数据存储在一个队列中并异步处理它们。在

相关问题 更多 >