【发布时间】:2012-12-14 00:28:23
【问题描述】:
在编写 nodejs 代理服务器时,我注意到在将数据写入另一个套接字端之前,数据可能会多次进入我的代理。每次我的数据进来时,我都会调用 socket.write(); ...
但是,由于发送的异步性质,我不确定 nodejs 是否保证传输数据的顺序与我安排写入的顺序相同。
有人知道nodejs在这种情况下的行为吗?
如果订单不能保证,那么我将不得不缓冲数据,直到我收到数据成功发送的回调。
【问题讨论】:
在编写 nodejs 代理服务器时,我注意到在将数据写入另一个套接字端之前,数据可能会多次进入我的代理。每次我的数据进来时,我都会调用 socket.write(); ...
但是,由于发送的异步性质,我不确定 nodejs 是否保证传输数据的顺序与我安排写入的顺序相同。
有人知道nodejs在这种情况下的行为吗?
如果订单不能保证,那么我将不得不缓冲数据,直到我收到数据成功发送的回调。
【问题讨论】:
Node.js 是单线程的,一次只能做一件事。它有一个按顺序处理的回调队列。 更多信息可以在这里找到:http://howtonode.org/understanding-process-next-tick。
只要你在接收数据时调用socket.write,它就会按顺序到达。如果您考虑一下,如果它不这样做,那么节点将无法用作网络服务器。例如,一个简单的 node express 站点可能使用 fs.readfile 从磁盘异步读取文件,并使用 socket.write 将其返回给浏览器。如果无法保证订单,则该文件可能无法正确返回。
来自节点 0.8.14 文档: http://nodemanual.org/latest/nodejs_ref_guide/net.html#net.Socket.write
如果整个数据已成功刷新到内核,则返回 true 缓冲。如果全部或部分数据在用户中排队,则返回 false 记忆。当缓冲区再次空闲时发出'drain'。
和
net.Socket 具有 socket.write() 始终有效的属性。这是 帮助用户快速启动和运行。电脑总不能 跟上写入套接字的数据量—— 网络连接可能太慢了。 Node.js 将在内部 将写入套接字的数据排队并通过线路发送出去 只要有可能。 (在内部,它轮询套接字的文件 可写描述符。)
【讨论】: