Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Конверт

Заголовки передаются внутри полезной нагрузки: сообщение, которому они нужны, пишется как 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, поэтому любой из них помещается в строку. Внутри сначала идёт длина блока заголовков в порядке big-endian, затем сам блок, затем полезная нагрузка. rs1: пишет каждый заголовок строкой name: value, и его читают прежние выпуски этого крейта. Он выбирается, когда каждый заголовок читается из такой строки без изменений. rs2: пишет каждое имя и значение со своей длиной, поэтому передаёт любые байты, и выбирается для остальных случаев.

Читатель открывает любой из двух конвертов и добавляет заголовок stream-sequence. Всё, что не является правильно сформированным конвертом, читается как полезная нагрузка без заголовков. Как сервис читает и задаёт заголовки, показывает страница Заголовки в компонентах.