FsEventBridge 是一款基于 Linux 内核 fanotify io_uring 等技术开发的高性能文件系统事件网关。它旨在解决大规模文件监控场景下的性能瓶颈,并将底层内核事件转换为易于消费的 JSON 流,通过 Unix Domain Socket (UDS) 跨语言分发给 Go、Java、Python 等上游业务逻辑。
- 内核级递归监控:利用
fanotify机制,支持对整个挂载点或大型目录树进行实时监控,无需像inotify那样手动递归添加监听。 - NFS文件监控:无需 NFS 服务端支持,实现对本机 NFS 客户端的文件监控。
- 极致性能:采用 C17 标准 编写,集成
io_uring实现异步 I/O,确保在每秒产生数千个文件的卫星接收等工业场景下依然保持极低的 CPU 和内存占用。 - 跨语言集成:通过
Unix Domain Socket发送 NDJSON (Newline-Delimited JSON),完美对接 Go、Python、Java 等高性能微服务架构。 - 工业级部署:原生支持 Systemd 集成,提供标准的
.deb和.rpm软件包封装,符合企业级运维规范。 - 灵活配置:支持命令行参数与 TOML 配置文件双重驱动,满足自动化脚本与守护进程化运行的不同需求。
FsEventBridge 作为“桥梁”,将底层复杂的内核调用与上游灵活的业务逻辑解耦:
- 监听层 (C17/fanotify):在内核 VFS 层捕获 FAN_CLOSE_WRITE 事件,确保只有完整落盘的文件才会被触发。
- 处理层 (io_uring):异步读取文件元数据(如大小、解析文件名标识),避免阻塞监控主循环。
- 分发层 (IPC/UDS):将事件封装为 JSON 并推送到 Unix Domain Socket。
- Linux Kernel >= 5.1 (推荐 6.x)
- GCC >= 12 (支持 C17)
- liburing
- libsystemd
mkdir build && cd build
cmake ..
make
# 生成 .deb 或 .rpm 包
cpack快速监控指定目录:
./FsEventBridge -d /data/sate -s /tmp/feb.sock使用 TOML 配置文件运行(支持 Systemd 管理):
./FsEventBridge -c /etc/FsEventBridge/config.toml由于 FEB 输出标准化的 JSON 流,上游程序可以极其简单地接入:
// 消费来自 FsEventBridge 的事件
conn, _ := net.Dial("unix", "/tmp/feb.sock")
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
var event MyFileEvent
json.Unmarshal(scanner.Bytes(), &event)
// 执行数据解析、业务逻辑
processSatelliteData(event.Path)
}[server]
socket_path = "/tmp/feb.sock"
log_level = "info"
[monitor]
path = "/data/sate"
recursive = true
events = ["CLOSE_WRITE", "MOVED_TO"]
exclude_extensions = [".tmp", ".swp"]
[processor]
# 启用 io_uring 加速
use_io_uring = true
worker_threads = 4本项目采用 Apache-2.0 协议开源。