socket.io(nodejs)发出回调是否会通过在回调完成期间阻止服务器来影响服务器性能?

时间:2015-01-30 01:33:30

标签: javascript node.js callback socket.io server

Say A向B发送消息并等待回调,然后A可能发送新消息,B也向A发送许多消息。

我的意思是在回调发生之前的这段时间内发生了其他消息交换。

它是否会创建竞争条件或阻止其他消息发送,直到第一个回调完成或它是否强制执行回调顺序,以便说消息1,2,3,4,5的回调始终以相同的顺序到达消息被发送出去了吗?

非常感谢协助。

1 个答案:

答案 0 :(得分:2)

嗯,问题涉及许多概念 - 很难完全回答。我会尽量给予部分回应或洞察力。 如果您提供了详细信息,为什么它对您的目的很重要 - 它可以帮助更好地确定答案。

nodejs的一个优点是它是一个单线程,事件驱动的非阻塞I / O模型 - 这意味着几乎没有或最小阻塞(至少在理论上)。 See conceptual model here

然而,由于传输,一致性等原因,应该发生一些微不足道的阻塞[?]。但这应该不是一个问题,因为这将是非常微不足道的,并且无论使用何种语言都会在所有程序中发生。 其次是关于套接字。 socket的概念认为,根据您的目的,它可以是阻塞的或非阻塞的。 Blocking and Non-blocking sockets 阻止并不一定意味着它很糟糕。

第三,即使没有阻塞,仍然没有事件并行发生。我的意思是即使A和B非常频繁地向对方发送消息 - 它们之间存在时间差 - 尽管对人类来说是微不足道的。甚至可以在百万分之一秒内表达这种差异。你真的可以在一秒钟内发送超过一百万条消息吗?因此,即使回调有一些影响 - 你应该为了你的程序而忽略它。而且,即使它们同时出现,javascript也可以一次做一件事 - 所以在收到时,你应该一次做一件事。例如,如果要显示或提醒消息,则它们将一次显示一条消息。

关于消息的排序,Node.js是单个事件循环。所以,我的理解是它运行一个不停的循环并等待事件,并按事件发生的顺序发出信息。例如Understanding nodejs event loop

 while(new Date().getTime() < now + 1000) { // do nothing }

所以,为了你的目的,我会说除非B在A发送消息和接收它的服务器之间发送消息,否则你应该先收到回调。简单地按照nodejs服务器接收它的顺序进行排序。希望能帮助到你。