Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Чтение
Файловый клиент следит за файлом потока, как tail -f, отделяет сообщения от маяков и
перематывает, просматривая маяки и читая вперёд.
Схема текстом
- Файл потока → Задача-источник читает до конца, ждёт: байты
- Задача-источник читает до конца, ждёт → Источник сообщений перешагивает маяки
- Источник сообщений перешагивает маяки → Консьюмер сообщения своего ключа
- Консьюмер сообщения своего ключа → Подписка по сообщению на next(): next()
- Источник сообщений перешагивает маяки → Просмотр маяков сужает область: перемотка
- Просмотр маяков сужает область → Возврат к этому маяку
- Возврат к этому маяку → Чтение вперёд до цели
- Воспроизведение: крейт сам читает источник сообщений, поэтому конец наступает после последнего сообщения
Задача читает файл до конца, а затем ждёт, пока операционная система сообщит об изменении. ОС может сообщить с опозданием, поэтому ожидание ограничено таймаутом: сначала 1 миллисекунда, затем, пока файл молчит, всё больше, до 1024. Серия записей сбрасывает ожидание к началу. Один наблюдатель обслуживает каждый файл в процессе, сколько бы читателей у файла ни было. Удаление файла с диска завершает поток.
Над этой задачей источник сообщений собирает кадры, перешагивает маяки и склеивает сообщение, которое маяк разделил. Консьюмер оставляет сообщения своих ключей потока и выдаёт их по одному на вызов.
Живая подписка - это такой консьюмер, открытый в режиме реального времени и поставленный на конец файла. В конце файла он не заканчивается, а ждёт следующей записи.
Воспроизведение читает источник сообщений напрямую и пропускает другие ключи. Собственное воспроизведение клиента читает с опережением и сообщает о конце, пока прочитанное наперёд ещё не доставлено, поэтому крейт его не использует.
Перемотка на начало или конец переходит туда сразу. Перемотка на порядковый номер или момент времени просматривает маяки в поисках области, где он находится, возвращается к этому маяку и читает вперёд до первого сообщения с этим номером или большим либо строго после этого момента. Чтение за конец файла отклоняет перемотку, и источник возвращается туда, где был. Перемотку нельзя прервать на полпути, поэтому крейт выполняет её в отдельной задаче, как показывает страница Перемотка.
В файле ничто не записывает, докуда дочитал читатель, поэтому сервис после перезапуска продолжает с позиции, которую сохранил сам.