#data-stream #stream #async-stream #stream-processing #async #data-file #file-format

bin+lib sea-streamer-file

🌊 SeaStreamer 文件后端

13 个版本

0.5.2 2024年7月6日
0.5.1 2024年4月24日
0.3.9 2023年12月4日
0.3.8 2023年11月17日
0.3.0 2023年7月11日

#938并发 中排名

Download history 921/week @ 2024-05-04 842/week @ 2024-05-11 903/week @ 2024-05-18 706/week @ 2024-05-25 661/week @ 2024-06-01 660/week @ 2024-06-08 703/week @ 2024-06-15 579/week @ 2024-06-22 604/week @ 2024-06-29 758/week @ 2024-07-06 724/week @ 2024-07-13 599/week @ 2024-07-20 444/week @ 2024-07-27 400/week @ 2024-08-03 465/week @ 2024-08-10 381/week @ 2024-08-17

每月 1,770 次下载
用于 8 个 Crates (直接使用 4 个)

MIT/Apache 许可

295KB
7K SLoC

Rust 5.5K SLoC // 0.0% comments TypeScript 1.5K SLoC // 0.1% comments Scheme 26 SLoC JavaScript 4 SLoC

sea-streamer-file: 文件后端

这与 sea-streamer-stdio 非常相似,但区别在于 SeaStreamerStdio 在实时工作,而 sea-streamer-file 则在实时和回放中工作。这意味着 SeaStreamerFile 有能力遍历 .ss (sea-stream) 文件,并搜索/回滚到特定的时间戳/偏移量。

此外,Stdio 只能与 UTF-8 文本数据一起工作,而 File 可以处理二进制数据。在 Stdio 中,每个进程只有一个 Streamer。在 File 中,同一个进程中可以有多个独立的 Streamer。毕竟,Streamer 只是一个文件。

SeaStreamerFile 的基本思路类似于 tail -f,每行一条消息,带有自定义的消息帧携带二进制有效负载。有趣的是,在 SeaStreamer 中,我们不使用分隔符来分隔消息。这消除了编码/解码消息有效负载的开销。但这给文件格式增加了复杂性。

SeaStreamerFile 格式是为了高效快进和搜索而设计的。这是通过在文件中放置固定间隔的信标数组来实现的。信标包含流的摘要,因此它像一个原地索引。它还允许读者与消息边界对齐。要了解更多关于文件格式的信息,请阅读 src/format.rs

在此基础上,还有 SeaStreamer 的高层多生产者、多消费者流语义,类似于其他 SeaStreamer 后端的行为。特别是,负载均衡行为与 Stdio 相同,即轮询。

解码器

我们提供了一个小型实用程序来解码 .ss 文件

cargo install sea-streamer-file --features=executables --bin ss-decode
 # local version
alias ss-decode='cargo run --package sea-streamer-file --features=executables --bin ss-decode'
ss-decode -- --file <file> --format <format>

提示:将其管道传输到 less 以进行分页

ss-decode --file mystream.ss | less

示例 log 格式

 # header
[2023-06-05T13:55:53.001 | hello | 1 | 0] message-1
 # beacon

示例 ndjson 格式

/* header */
{"header":{"stream_key":"hello","shard_id":0,"sequence":1,"timestamp":"2023-06-05T13:55:53.001"},"payload":"message-1"}
/* beacon */

还有一个在sea-streamer-file-reader下的Typescript实现。

待办事项

  1. 可恢复:目前尚未实现。可能的一种实现方式是将数据提交到本地的SQLite数据库中。
  2. 分片:目前它只流式传输到分片零。
  3. 验证:一个用于验证和修复SeaStreamer二进制文件的实用程序。

依赖项

~6–22MB
~287K SLoC