socket.io |异步响应是不是按顺序堆叠?

Posted

技术标签:

【中文标题】socket.io |异步响应是不是按顺序堆叠?【英文标题】:socket.io | are asynchronous responses stacked up in order?socket.io |异步响应是否按顺序堆叠? 【发布时间】:2021-12-14 21:41:26 【问题描述】:

    客户端发出newdataFromClient 来服务器

    服务器开始处理新数据:

socket.on('newdataFromClient', async(newdataFromClient) => 
  let result = await doSomething(newdataFromClient)
  socket.emit('response', result)
)
    当服务器未完成处理时,客户端发送更多数据

服务器最终会发出 2 个结果并将它们发送回客户端。每个收到的newdataFromClient 一个。

结果会按顺序发回,还是先发回结果更快的结果?

我在 Macbook Pro 上运行基本节点服务器。如果服务器开始一个接一个地获取多个newdataFromClient,它是否会开始在单独的线程上处理每个,当它用完线程时会开始按顺序堆叠它们?

我认为如果我的服务器无法处理太多调用,它无论如何都会崩溃,但这是一个单独的问题。

这里我只关心服务器响应的顺序

【问题讨论】:

【参考方案1】:

socket.io 事件将按照它们从服务器发送的顺序到达。这里的底层传输是 TCP,它使数据包保持有序。

现在,如果服务器本身正在处理各个到达的请求并在处理发送结果的过程中,它具有异步操作,则服务器可能无法保证它将发送响应的顺序。事实上,很可能服务器上的完成顺序是不可预知的。

结果是按顺序发回还是先发回哪个完成得快?

无论哪个在服务器上首先完成并发送回消息,都是客户端首先收到的消息。这些是独立的消息,只要它们在服务器上发出,它们就会简单地传输到客户端。而作为 socket.io 引擎基础的 webSocket 协议基础的 TCP 传输将按照它们最初从服务器发送的顺序保存这些数据包。


socket.io 中的确认功能

socket.io 确实有一种从特定消息中获取特定“ack”的方法。如果您查看socket.emit() doc,您会看到其中一个可选参数是 ack 回调。这可以用于(与发送 ack 响应的服务器一起)来获取对此特定消息的特定响应。有关如何实现的详细信息,请参阅该“ack”功能的客户端和服务器端文档。

如果不使用该内置功能,您将不得不构建自己的基于 messageID 的系统,以便您可以匹配从服务器返回的给定响应与原始请求(这就是“ack”功能在内部所做的),因为套接字.io 本身不是请求/响应协议(它是消息协议)。

【讨论】:

以上是关于socket.io |异步响应是不是按顺序堆叠?的主要内容,如果未能解决你的问题,请参考以下文章

Node JS、Socket.io、异步和阻塞事件循环

自定义异步IO模块开发

按顺序附加异步响应 swit 3

使用 socket.io 响应 Native 一对一对话

promise执行顺序

按顺序运行异步套接字操作