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

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

Канал

Клиент stdio читает стандартный ввод в одном потоке и пишет в стандартный вывод в другом, по строке на сообщение, для всего процесса.

Как клиент stdio принимает строки от предыдущей ступени и передаёт их следующейПредыдущая ступеньПоток stdinчитает и разбирает строкуРаздача по ключу потока:строка без ключаидёт всем консьюмерамStdioConsumerпо одному на подпискуStdioPublisherконверт, если нужноПоток stdoutнумерует, ставит время[time | key | seq]payloadСледующая ступеньОдин поток stdin и один поток stdout на процесс:завершение работы закрывает в нём все потоки stdio
Схема текстом
  1. Предыдущая ступень → Поток stdin читает и разбирает строку: строки
  2. Поток stdin читает и разбирает строку → Раздача по ключу потока: строка без ключа идёт всем консьюмерам
  3. Раздача по ключу потока: строка без ключа идёт всем консьюмерам → StdioConsumer по одному на подписку
  4. StdioPublisher конверт, если нужно → Поток stdout нумерует, ставит время
  5. Поток stdout нумерует, ставит время → [time | key | seq] payload
  6. [time | key | seq] payload → Следующая ступень
  7. Поток stdout нумерует, ставит время → Раздача по ключу потока: строка без ключа идёт всем консьюмерам
  8. Один поток stdin и один поток stdout на процесс: завершение работы закрывает в нём все потоки stdio

Строка имеет вид [timestamp | stream_key | sequence | shard_id] payload, и каждое поле в скобках необязательно. Метка времени записывается как YYYY-MM-DDTHH:MM:SS, доли секунды допускаются. Строка, которая начинается с [WORD], читается с ключом потока WORD.

Первая подписка запускает поток stdin. Он читает строку, разбирает её поля и передаёт консьюмерам её ключа. Строка без ключа достаётся каждому консьюмеру, поэтому случайная строка в стандартном выводе предыдущей ступени доходит до каждой подписки этой ступени. Когда ступень запускается, крейт придерживает стандартный ввод, пока не появится первый консьюмер, поэтому уже ждущая строка не теряется.

Первая публикация запускает поток stdout. Он нумерует каждый ключ с нуля, ставит время записи с точностью до секунды и печатает строку. Пустую полезную нагрузку он пропускает, поэтому издатель отклоняет пустое сообщение, а не сообщает о строке, которая так и не ушла. Полезная нагрузка, которую изменила бы строка, помещается в конверт.

Пунктирная стрелка - это loopback: поток stdout также передаёт каждую строку собственным консьюмерам этого процесса. Так сервис stdio работает в одном процессе, как в тесте.

Оба потока принадлежат процессу, а не брокеру. Завершение работы закрывает каждый консьюмер и продюсер stdio в процессе, после того как каждая подписка доставила уже прочитанные строки. Когда стандартный ввод заканчивается, поток stdin останавливается, а подписки остаются открытыми. Строка не в UTF-8 или строка, скобки которой не разбираются, аварийно завершает процесс.

Модель принадлежит sea-streamer-stdio (клиент). Как подписка читает свой ключ, показывает страница Строки.