英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
信封
消息头放在载荷里传递:需要消息头的消息写成 rs1: 或 rs2: 加 base64,不需要的消息原样写入。
以文字阅读本图
- 要发布的消息 消息头和载荷 → 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗?
- 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗? → 载荷 原样写入: 否
- 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗? → 每个消息头都能 在文本行中保持不变吗?: 是
- 每个消息头都能 在文本行中保持不变吗? → rs1: base64( u32 长度, name: value 行, 载荷): 是
- 每个消息头都能 在文本行中保持不变吗? → rs2: base64( u32 长度, 长度、名称、 长度、值 .., 载荷): 否
- 读取者能打开任一种信封;其他内容 都读作不带消息头的载荷
两个客户端都没有消息头的位置:一条消息就是一个流键和一份载荷。所以,发布者把消息头写进载荷,放在信封里,订阅再把信封打开。
没有消息头的消息原样写入。这样写成的文件仍是一串普通的载荷,任何 sea-streamer 读取者都能理解。以 rs1: 或 rs2: 开头的载荷无论如何都会套上信封,否则读取者会把它当成信封。
管道承载 UTF-8 文本,每条消息一行,另一端的读取者会修剪每一行。因此在管道上,不是 UTF-8 的载荷、含换行的载荷、以空白开头或结尾的载荷也会套上信封,并完整到达。
两种信封都是一个前缀加 base64,所以都能放进一行。信封内部先是消息头块的大端序长度,然后是这个块,最后是载荷。rs1: 把每个消息头写成一行 name: value,本 crate 的早期版本读取这种形式。每个消息头都能从这样的行中原样读回时,使用 rs1:。rs2: 为每个名称和值各写上自己的长度,因此能承载任意字节,其余情况都使用它。
读取者能打开任一种信封,并加上 stream-sequence 消息头。不是格式正确的信封的内容,都读作不带消息头的载荷。服务如何读取和设置消息头,见组件中的消息头。