首页 > 解决方案 > socket.io | 异步响应是否按顺序堆叠?

问题描述

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

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

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

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

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

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

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

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

标签: javascriptnode.jsasynchronousserversocket.io

解决方案


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

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

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

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


socket.io 中的确认功能

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

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


推荐阅读