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

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

Чтение

Файловый клиент следит за файлом потока, как tail -f, отделяет сообщения от маяков и перематывает, просматривая маяки и читая вперёд.

Как файловый клиент читает файл потока и как его перемотка находит позициюФайл потокаЗадача-источникчитает до конца, ждётИсточник сообщенийперешагивает маякиКонсьюмерсообщения своего ключаПодпискапо сообщению на next()Просмотр маяковсужает областьВозвратк этому маякуЧтение вперёддо целиВоспроизведение: крейт сам читает источник сообщений,поэтому конец наступает после последнего сообщения
Схема текстом
  1. Файл потока → Задача-источник читает до конца, ждёт: байты
  2. Задача-источник читает до конца, ждёт → Источник сообщений перешагивает маяки
  3. Источник сообщений перешагивает маяки → Консьюмер сообщения своего ключа
  4. Консьюмер сообщения своего ключа → Подписка по сообщению на next(): next()
  5. Источник сообщений перешагивает маяки → Просмотр маяков сужает область: перемотка
  6. Просмотр маяков сужает область → Возврат к этому маяку
  7. Возврат к этому маяку → Чтение вперёд до цели
  8. Воспроизведение: крейт сам читает источник сообщений, поэтому конец наступает после последнего сообщения

Задача читает файл до конца, а затем ждёт, пока операционная система сообщит об изменении. ОС может сообщить с опозданием, поэтому ожидание ограничено таймаутом: сначала 1 миллисекунда, затем, пока файл молчит, всё больше, до 1024. Серия записей сбрасывает ожидание к началу. Один наблюдатель обслуживает каждый файл в процессе, сколько бы читателей у файла ни было. Удаление файла с диска завершает поток.

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

Живая подписка - это такой консьюмер, открытый в режиме реального времени и поставленный на конец файла. В конце файла он не заканчивается, а ждёт следующей записи.

Воспроизведение читает источник сообщений напрямую и пропускает другие ключи. Собственное воспроизведение клиента читает с опережением и сообщает о конце, пока прочитанное наперёд ещё не доставлено, поэтому крейт его не использует.

Перемотка на начало или конец переходит туда сразу. Перемотка на порядковый номер или момент времени просматривает маяки в поисках области, где он находится, возвращается к этому маяку и читает вперёд до первого сообщения с этим номером или большим либо строго после этого момента. Чтение за конец файла отклоняет перемотку, и источник возвращается туда, где был. Перемотку нельзя прервать на полпути, поэтому крейт выполняет её в отдельной задаче, как показывает страница Перемотка.

В файле ничто не записывает, докуда дочитал читатель, поэтому сервис после перезапуска продолжает с позиции, которую сохранил сам.