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

socket.io | are asynchronous responses stacked up in order?

  1. 客户端发出 newdataFromClient 到服务器

  2. 服务器开始处理新数据:

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

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

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

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

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

这里我只对服务器响应的顺序感兴趣。

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

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

Will the results be sent back in order or is whichever one finishes faster the one that will be sent back first ?

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


socket.io

中的确认功能

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

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