在将本地文件写入网络时以高性能方式流式传输本地文件

High performance ways to stream local files as they're being written to network

今天存在一个系统,当数据包捕获文件进入时,会将它们写入本地磁盘。出于容错原因,将这些文件作为第一步删除到本地磁盘被认为是可取的。如果客户端死机并需要重新连接或在其他地方启动,我们可以享受从磁盘重播的能力。

数据管道的下一步是尝试将登陆到磁盘的数据传输到远程客户端。假设有足够的磁盘 space,我觉得使用本地磁盘(以及其上的页面缓存)作为持久性无限 FIFO 非常方便。还希望使用文件系统来保持生产者和消费者之间的低耦合。

在我的研究中,我没有找到很多关于这种架构的指导。更具体地说,我没有在流行的开源 libraries/frameworks 中看到用于读取文件的成熟模式,因为它正在被写入以流出。

我的问题:

  1. 这个架构中是否存在我没​​有注意到或间接淡化的缺陷?

  2. 是否有关于在写入文件时使用文件并有效阻止 and/or 在文件中有更多数据可用时异步通知的建议?

  3. 目标是明确或隐含地让消费者从页面缓存热度中受益。有没有关于如何为此优化的建议?

基于文件的解决方案听起来很笨拙,但可以工作。类似于 tail -f 的做法:

  • read 文件直到 EOF,但不关闭它
  • 设置 inode watch(inotify),等待更多写入
  • 重复

困难通常在于文件轮换和清理,即您需要注意新文件 and/or 截断。

话虽如此,直接连接到数据包捕获接口或设置客户端可以订阅的 queue 可能更有效。