英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
写入者
每个流文件一个写入任务,它为每条消息分帧并放置信标;本 crate 在每次发布后刷写,关闭时文件同步到设备。
以文字阅读本图
- FilePublisher 先信封,再 send_to → 客户端的生产者 把消息排入队列
- 客户端的生产者 把消息排入队列 → 写入任务 每个进程每个文件一个
- 写入任务 每个进程每个文件一个 → 消息接收端 分帧,放置信标
- 消息接收端 分帧,放置信标 → 流文件
- 每次发布后 调用 flush(): 交给操作系统 → 消息接收端 分帧,放置信标
- 关闭时调用 一次 sync_all(): 写到设备 → 消息接收端 分帧,放置信标
- 客户端在文件达到 16 GiB 时停止写入: 这次及之后的每次发布都会失败
发布者 FilePublisher 把流键和载荷交给客户端的生产者。生产者把它排入该文件写入任务的队列。写入任务在键内为消息编号、分帧,并在下一个间隔所在之处插入信标。
字节先积存在缓冲区里,直到有人要求取出。本 crate 在每次发布后都提出这个要求:刷写把消息交给操作系统之后,publish 才返回。从这时起,同一文件的实时读取者就能看到这条消息,无论它在本进程还是另一个进程中。
生产者结束时,文件同步到设备一次。本 crate 在关闭时结束生产者;如果设置了流结束标记,则在写入它之后结束。上次同步之后发布的消息能在进程崩溃后保留下来,但不能在断电后保留下来。
一个进程中同一文件的所有生产者共用一个写入任务,写入任务统计生产者句柄的数量。在已有消息的文件上打开生产者时,会先向后扫描到最后一个信标,再向前扫描到末尾,以得知每个键的编号到了哪里。这次扫描随文件增大而变长。本 crate 对每个文件一次只交给写入任务一次追加,因此一次失败的追加不会让其他发布一直等待。
客户端默认在文件达到 16 GiB 时停止写入,本 crate 保留这一默认上限。达到上限的发布会失败,之后向该文件的每次发布都会立即返回这个错误。