跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

设计

ruststream-sea-file 的位置:在 RustStream 运行时与两个 sea-streamer 客户端之间,流文件一列,管道一列。

自上而下依次是服务、RustStream 运行时、本 crate、sea-streamer 客户端及其连接的对象你的服务RustStream 核心ruststream-sea-filesea-streamer 客户端#[subscriber]订阅者处理器RustStream::new(..).with_broker(..)运行时:分发、编解码器、结算、重试FileSubscriber驱动任务StdioSubscriber读取任务FilePublisherStdioPublisherFileBrokerConnectedFileBrokerStdioBrokerConnectedStdioBroker消息头信封消息头放在载荷里sea-streamer-filesea-streamer-stdio磁盘上的 .ss 文件stdin 和 stdout在 testing 下,Broker 的连接可以是内存中的文件或管道而不是客户端
以文字阅读本图
  1. 你的服务: #[subscriber] 订阅者处理器; RustStream::new(..) .with_broker(..)
  2. RustStream 核心: 运行时:分发、编解码器、结算、重试
  3. ruststream-sea-file: FileSubscriber 驱动任务; StdioSubscriber 读取任务; FilePublisher; StdioPublisher; FileBroker ConnectedFileBroker; StdioBroker ConnectedStdioBroker; 消息头信封 消息头放在载荷里
  4. sea-streamer 客户端: sea-streamer-file; sea-streamer-stdio
  5. #[subscriber] 订阅者处理器 → 运行时:分发、编解码器、结算、重试: 挂载到
  6. 运行时:分发、编解码器、结算、重试 → FileSubscriber 驱动任务: 轮询流
  7. 运行时:分发、编解码器、结算、重试 → StdioSubscriber 读取任务
  8. FileSubscriber 驱动任务 → sea-streamer-file
  9. StdioSubscriber 读取任务 → sea-streamer-stdio
  10. sea-streamer-file → 磁盘上的 .ss 文件
  11. sea-streamer-stdio → stdin 和 stdout
  12. 在 testing 下,Broker 的连接可以是内存中的文件或管道 而不是客户端

本 crate 在 sea-streamer 的两个客户端之上实现核心的 Broker trait。sea-streamer-file 负责流文件,sea-streamer-stdio 负责进程的标准输入和标准输出。它上面的运行时对每个 Broker 都相同。文件或管道特有的一切都在本 crate 里:描述符、位置与定位、ack 的含义、重试副本发往何处,以及消息头如何传递。

已连接的 Broker 持有一条通往其传输的连接。对文件来说,这条连接包括客户端的 streamer、一个生产者和执行 connect 的运行时,每次发布都通过这个生产者追加。对 stdio 来说,它包括客户端的 streamer 和那个运行时。Broker 的每个克隆共用这条连接,因此连接两次只会连接一次。连接之前交出的发布者在第一次发布时找到它。

连接的每个任务都运行在执行 connect 的运行时上。因此,从另一个运行时打开的订阅,在那个运行时停止后仍会继续投递。

文件订阅是一个驱动任务,它独占客户端的消费者。原因是客户端的定位需要独占消费者,而且不能中途打断。stdio 订阅是一个读取任务。二者都通过容量为 64 的通道交出消息。两个客户端都一次读取一条消息,因此批在本 crate 中组装。不满的批在它的第一条消息到达 10 毫秒后发出。

两种传输都不接受逐条消息的设置,所以发布没有选项。客户端只接受载荷,不接受消息头,所以消息头放在载荷里,在信封中传递。

各部分如何启动和停止,见生命周期;一条消息的路径,见路径。