Node.js sockets.io需要同步吗



我目前正在使用node.js,使用socket.io库来实现一个简单的聊天应用程序。在这个应用程序中,出于无关的原因,我想建立一个系统,在这个系统中,客户端可以向服务器请求一条信息。然后,服务器将此请求广播给所有其他联机套接字,若它们有答案,就会用答案进行响应。然后,服务器最终将收到的(第一个(响应返回给发出请求的原始客户端套接字。

当然,客户端可能会收到多个响应,而只需要一个响应。因此,一旦收到一个,其他的就应该丢弃。然而,感觉我应该使用某种同步的数据结构/代码来确保对";如果已经接收到回答";按预期工作。

我已经对此主题进行了一些搜索,但我看到有几次提到node.js使用事件驱动模型,不需要任何同步的代码/数据结构,因为没有多个线程。这是真的吗?我的场景不需要特别关注同步吗?它会起作用吗?或者我需要使用一些同步方法吗?如果需要,请使用哪些方法?

代码示例:

socket.on('new_response', async data => {
await processResponse(data)
}); 

由于我使用加密,我不得不使用async/await,这使事情更加复杂。processResponse函数检查是否已经接收到响应,如果没有,则处理它,否则忽略它

我建议做一些简单的事情,比如在每个广播中向客户提供一个uniqueID,询问他们是否有一条信息。然后,客户端在发送的任何响应中都包含相同的uniqueID。

这样,你的服务器就可以从客户端接收答案,只需跟踪它已经收到了哪个uniqueID值的答案,然后,如果已经收到了该uniqueID的答案,它就会忽略稍后做出响应的客户端。

uniqueID是服务器端生成的,因此它可以是一个不断增加的数字。您可以将迄今为止使用的数字存储在服务器端Set对象中,这样您就可以快速查找是否已经收到该uniqueID的响应。

然后,唯一要做的就是在某个时候将这些uniqueID在集合中老化,这样它们就不会永远累积。一个简单的方法是每隔15分钟左右用第二个Set对象替换Set对象,保留一个旧的一代,这样您就可以同时检查它们。

最新更新