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

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

信封

消息头放在载荷里传递:需要消息头的消息写成 rs1: 或 rs2: 加 base64,不需要的消息原样写入。

发布如何把消息的消息头和载荷写进客户端承载的字节要发布的消息消息头和载荷它有消息头吗?以 rs1: 或 rs2: 开头吗?或者在管道上,载荷会被一行改变吗?载荷原样写入每个消息头都能在文本行中保持不变吗?rs1: base64(u32 长度,name: value 行,载荷)rs2: base64(u32 长度,长度、名称、长度、值 ..,载荷)读取者能打开任一种信封;其他内容都读作不带消息头的载荷
以文字阅读本图
  1. 要发布的消息 消息头和载荷 → 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗?
  2. 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗? → 载荷 原样写入: 否
  3. 它有消息头吗?以 rs1: 或 rs2: 开头吗? 或者在管道上,载荷会被一行改变吗? → 每个消息头都能 在文本行中保持不变吗?: 是
  4. 每个消息头都能 在文本行中保持不变吗? → rs1: base64( u32 长度, name: value 行, 载荷): 是
  5. 每个消息头都能 在文本行中保持不变吗? → rs2: base64( u32 长度, 长度、名称、 长度、值 .., 载荷): 否
  6. 读取者能打开任一种信封;其他内容 都读作不带消息头的载荷

两个客户端都没有消息头的位置:一条消息就是一个流键和一份载荷。所以,发布者把消息头写进载荷,放在信封里,订阅再把信封打开。

没有消息头的消息原样写入。这样写成的文件仍是一串普通的载荷,任何 sea-streamer 读取者都能理解。以 rs1: 或 rs2: 开头的载荷无论如何都会套上信封,否则读取者会把它当成信封。

管道承载 UTF-8 文本,每条消息一行,另一端的读取者会修剪每一行。因此在管道上,不是 UTF-8 的载荷、含换行的载荷、以空白开头或结尾的载荷也会套上信封,并完整到达。

两种信封都是一个前缀加 base64,所以都能放进一行。信封内部先是消息头块的大端序长度,然后是这个块,最后是载荷。rs1: 把每个消息头写成一行 name: value,本 crate 的早期版本读取这种形式。每个消息头都能从这样的行中原样读回时,使用 rs1:。rs2: 为每个名称和值各写上自己的长度,因此能承载任意字节,其余情况都使用它。

读取者能打开任一种信封,并加上 stream-sequence 消息头。不是格式正确的信封的内容,都读作不带消息头的载荷。服务如何读取和设置消息头,见组件中的消息头。