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

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

Запись

Одна задача записи на файл потока оформляет каждое сообщение в кадр и расставляет маяки. Крейт сбрасывает файл после каждой публикации, а при завершении работы файл синхронизируется с устройством.

Как публикация доходит до файла потока и когда файл сбрасывается и синхронизируетсяFilePublisherконверт, затем send_toПродюсер клиентаставит сообщение в очередьЗадача записиодна на файл в процессеПриёмник сообщенийкадры и маякиФайл потокаКаждаяпубликация:flush() в ОСПри завершении:sync_all()на устройствоКлиент останавливает файл на 16 ГиБ:эта и все следующие публикации возвращают ошибку
Схема текстом
  1. FilePublisher конверт, затем send_to → Продюсер клиента ставит сообщение в очередь
  2. Продюсер клиента ставит сообщение в очередь → Задача записи одна на файл в процессе
  3. Задача записи одна на файл в процессе → Приёмник сообщений кадры и маяки
  4. Приёмник сообщений кадры и маяки → Файл потока
  5. Каждая публикация: flush() в ОС → Приёмник сообщений кадры и маяки
  6. При завершении: sync_all() на устройство → Приёмник сообщений кадры и маяки
  7. Клиент останавливает файл на 16 ГиБ: эта и все следующие публикации возвращают ошибку

Издатель FilePublisher передаёт ключ потока и полезную нагрузку продюсеру клиента. Продюсер ставит их в очередь задачи записи файла. Задача нумерует сообщение в пределах его ключа, оформляет в кадр и вставляет маяк там, где наступает следующий интервал.

Байты копятся в буфере, пока их кто-нибудь не запросит. Крейт запрашивает их после каждой публикации: publish возвращается, когда сброс передал сообщение операционной системе. Живой читатель того же файла, в этом процессе или в другом, видит сообщение с этого момента.

Файл синхронизируется с устройством один раз, когда завершается продюсер. Крейт завершает его при завершении работы, после метки конца потока, если она задана. Сообщение, опубликованное после последней синхронизации, переживает сбой процесса, но не отключение питания.

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

Клиент останавливает файл на 16 ГиБ, если не задано иное, и этот крейт оставляет предел по умолчанию. Публикация, которая достигает предела, возвращает ошибку, и каждая следующая публикация в этот файл сразу возвращает ту же ошибку.