了解 Node.js 中的 WriteStream

Understanding the WriteStream in Node.js

最近我使用 Node.js 和 Socket.IO 编写了一个小型多房间聊天应用程序,我根据消息发生的房间将发送的消息记录到不同的文件中。目前我正在使用用于存档此功能的 writeStreams 数量(每个房间一个),但虽然它有效,但我一直想知道这是否真的应该使用 writeStreams。

我的顾虑:

  1. 当我第一次实现 writeStream 时,它似乎是完美的匹配,因为它不是写入整个文件,而是在每次发布新文件时写入消息——但回顾起来,我不确定是否一直打开 10-20 个流是理想的。
  2. 目前我在最后一个用户离开房间时使用 .end() 函数,但是除了在这种情况下我不能使用的回调函数之外,似乎无法判断是否所有消息都已被发送在调用 end() 时已经写好了,这让我回到了 1. 以及我是否真的在使用 writeStreams 的问题,因为它们应该被使用。

我想我的问题是... can/should 在这种情况下可以使用 writeStreams 进行日志记录吗?那些实际上是在等待输入时占用资源,还是长时间打开大量资源会节省资源?

关于第 2 点,我可以很快:当您在 writeStream 上调用 .end() 时,该流不再接受新的写入,但会完成将其拥有的数据写入文件系统。所以你不必担心丢失部分聊天记录 - 当然除非发生错误(为此,请收听流的 'error' 事件)。

关于第 1 点:我认为让文件系统流长时间保持打开状态没有任何问题。例如,许多应用程序这样做是为了写入它们的日志。我在您的设置中看到的一个可能问题是,随着您的聊天系统处理的数据量的增加,您可能会更快地生成聊天日志,然后将它们写入文件系统。如果发生这种情况,您的流将开始缓冲越来越多的数据,最终您的进程将 运行 内存不足并崩溃。当然这取决于你的数据量。