按接收顺序处理 WebSockets 消息

Posted

技术标签:

【中文标题】按接收顺序处理 WebSockets 消息【英文标题】:Processing WebSockets messages in order of receiving 【发布时间】:2012-12-26 13:40:50 【问题描述】:

我的应用程序的客户端部分需要以严格的顺序处理 WebSocket 消息。不幸的是,每条消息的处理时间都很长(大约 3 秒),因此在第一条消息结束之前出现了另一条消息。几条消息后,顺序完全不同。如何在 javascript 中解决这个问题。

我想过一个任务队列,但我不知道如何实现它以不阻止我的网络应用程序的 GUI。

【问题讨论】:

这不是和***.com/questions/11804721/…矛盾吗? 另见***.com/a/42386494/2277240 【参考方案1】:

我认为另一个答案是错误的。 WebSocket IS TCP,这意味着传送顺序有保证。正如@Maël Nison 所引用的,请参阅RFC6455:

消息片段必须按照发件人发送的顺序传递给收件人

因此,您可以认为您的处理将按顺序开始。但是,如果您有很多异步回调,那么稍后的处理可能会在之前的处理仍在进行之前完成。但这只是错误的实现(还有一点回调地狱)。

类似帖子:

Can websocket messages arrive out-of-order? Websocket: are server data sent synchronously?

【讨论】:

我用 SocketIO、EngineIO 和 ws 库做了一些压力测试。 EngineIO 中的消息顺序有问题(与 SocketIO 的代码几乎相同;我没有深入研究),但 SocketIO 和 ws 中的消息顺序很好——即使服务器在压力测试下半死.【参考方案2】:

目前,浏览器中的 WebSocket API 不公开 基于帧的流式 选项/API。所以没有真正的选择来完成这个本机

这意味着您需要在从服务器发送到客户端的数据包中创建自己的逻辑/结构。这应该是一项相对容易的任务,我可以考虑传输简单的 JSON 字符串/对象,它可能在顶层具有 索引属性


    packetIndex: 0,
    data:  

您的客户端脚本需要查看每个到达的数据包并正确分类(跟踪到达的数据包,如果到达的数据包索引太高,则“保持 + 等待”)

【讨论】:

这似乎是错误的“消息片段必须按照发件人发送的顺序传递给收件人。” 这确实是正确的答案,TCP按正确的顺序发送数据包,客户端按正确的顺序接收它,但是客户端可能需要时间来处理每个请求,所以当它采取下一个,它可能会处理错误的。例如,在 Golang 中,我在 go 例程中启动它们以提高性能。

以上是关于按接收顺序处理 WebSockets 消息的主要内容,如果未能解决你的问题,请参考以下文章

客户端未使用 websockets 接收所有消息

javax.websockets / Tyrus 中的线程

无法从 Azure 服务总线中的并发会话按顺序接收消息

Spring Websockets:如何验证消息和接收客户端?

QT - WebSockets

允许在 websockets 中删除消息