Пользователь:Vovkav/fsqueue
Из проекта Вавилон.wiki
Внимание! В данный момент этот документ является наброском идей для реализации в виде библиотек для различных языков программирования (в первую очередь - Perl, Python, Java, C#/dotnet/mono, в дальнейшем - shell, C, C++).
Комментарии (особенно названия библиотек-модулей, могущих помочь в реализации) приветствуются здесь.
Оглавление |
Общее описание
Fsqueue (Filesystem-based queue - "Очередь на базе файловой системы") - это простой механизм для организации парно-асимметричного, агностического, возможно управляемого пользователем, возможно распределенной создания очереди элементов программой-"поставщиком" и её обработкой программой-"потребителем", основанный на директориях и файлах.
В 2-х словах - fsqueue - это очередь, где каждый элемент - это файл, с понятным для человека именем и/или текстовым содержимым, внутри заданной директории и, возможно, ее поддиректориях. После удачной или неудачной обработки, файл перемещается в определенную поддиректорию, при удачной обработке - возможно, удаляется.
Механизм fsqueue удобен, когда:
- необходима длительная по времени обработка (короткой или длинной) очереди однотипных задач,
- при наличии угрозы/необходимости прерывания её исполнения и последующем продолжении с места прерывания,
- необходимости ручной корректировки порядка или содержимого элементов во время работы с очередью или вне её с помощью инструментов типа norton commander или midnight commander (с помощью команд view, edit, move).
Основные свойства
- парная асимметричность - программы, использующие механизм по отношению к данной очереди являются "поставщиками" или "потребителями". "Поставщики" добавляют/удаляют элементы в очереди, "потребители" ?удаляют? элементы из очерерди по мере обработки;
- управляемость - возможно вмешательство в работу механизма (ручное добавление, удаление и изменение последовательности обработки элементов) пользователем с помощью команд управления файлами или оболочек наподобие Norton Commander;
- асинхронность, персистентность - создание, обработка и удаление элементов "поставщиком" и "потребителем" или пользователем происходят независимо, и не требуют работы ни одного из компонентов, в случае аварийной остановки "потребителя" возможно возобновление обработки набора с того места, где она была прервана;
- распределенность - реализация механизма fsqueue прозрачна для сети, при условии "видимости" соответствующей директории в рамках файловых систем, где запускаются "поставщики" и "потребители";
- агностицизм - взаимодействие "поставщиков" и "потребителей" не зависит от используемого языка программирования и операционной системы.
Спецификация версия 0.0
Термины
- Поставщик - программа, формирующая исходную очередь
- Потребитель - программа, осуществляющая действия .... ???
- Посредник - программа, преобразующая одну очередь в другую, возможно с промежуточной обработкой
Условия хранения и изменения в рамках файловой системы
Экземпляр fsqueue реализуется в виде директории ("рабочей") с поддиректориями и файлами. Один файл соответствует одному элементу очереди. Интерпретация конкретики задачи-файла-элемента целиком зависит от пары "поставщик"-"потребитель".
Одна программа ("поставщик") формирует, а другая ("потребитель") использует как набор входных данных для обработки.
- По мере обработки, "потребитель" перемещает файлы, соответствующие успешно обработанным элементов в поддиректорию /success/.
- политика уничтожение файлов в этой директориии - специфично для конкретного экземпляра fsqueue
- безнадежно не могут быть обработаны - в /failed/
- Временно не могут быть обработаны - в /delayed/
- из этой папки элементы перемещаются "потребителем" обратно в основную папку при исчерпании обычных элементов или пользователем вручную, для некоторых случаев, возможно неиспользование отдельной папки, а простой пропуск с оставлением файла на месте...
- Приостановлены пользователем или "поставщиком" - /paused/
- могут быть перемещены обратно пользователем или поставщиком
- ??? для файлов в обработке - /process/ - нужно только в случае запуска обработочика параллельно с др программами
- ??? для новых элементов - /new/ - переименовывать по ходу - только для запуска "поставщика" параллельно с "потребителем"
- в директории /_meta/ хранятся метаданные по настройкам данного экземпляра очереди
Действия "поставщика" при попытке добавления в очередь элемента с существующим именем - зависит от конкретики экземпляра очереди, типа очереди и места, где уже был элемент.
Упорядоченность или неупорядоченность элементов - зависит от реализации и текущих настроек программы-потребителя. Сортировка элементов по умолчанию - алфавитная по имени файла без расширения.
Рекомендуется использование текста в кодировке utf-8 для хранения информации в файлах-элементах.
Формат имени файла - рекомендуемый - 8(имя)+3(расширение) (примечание - для MS DOS совместимости) обязательный - ?30+3 (для совместмиости с др файловыми системами).
Параметры, настраиваемые для каждого типа и/или экземпляра fsqueue
- схема имен файлов:
- в случае наличия явного "первичного ключа" - значение ключа, ***возможно, обрезанное,
- возможно с экранированными символами
- возможно с добавлением суффикса для уникальности (возм. uuid)
- uuid (??? названия реализующих библиотек) - не рекомендуется, так как затрудняет ручное управление элементами очереди;
- в случае наличия явного "первичного ключа" - значение ключа, ***возможно, обрезанное,
- схема расширений файлов (TODO - в зависимости от типа элементов очереди, внешний вопрос по отношению к рассматриваемой библиотеке):
- .txt
- .xml
- ??? (дабавьте свое)
API ...
TODO: Реализовать интерфейс как у Стека/дека/???
... для поставщика
- конструктор (с инициализацией, инициализацией по надобности, настройка параметров, ...)
- ?? изменить параметры очереди
- поставить в очередь (??? порядок элемента?)
- удалить из очереди (??? порядок элемента)
- ??? переместить в рамках очереди
... для потребителя
- конструктор
- получить очередной элемент (???и сделать его текущим по обработке???)
- просигналить о завершении обработки текущего элемента (успешно/неуспешно/???)
- деструктор с возможностью удаления 'done'
Детали реализации API
TODO: блокировки при принятии задачи "на обработку"
TODO: блокировки и выбор имени при создании нового элемента в очереди
Сценарии использования
Обобщенный сценарий
Обобщенный сценарий использования механизма -
- программа-"поставщик" создает очередь
- оператор инспектирует полученную очередь, при необходимости
- меняя последовательность обработки элементов,
- добавляя
- удаляя элементы очереди
- оператор запускает программу-"потребитель", для которой очередь является набором входных данных.
Сценарий для mediawiki-ботов
Изначально механизм fsqueue планируется использовать для организации очередей автоматизированной обработки статей в рамках энциклопедии викизнание, при котором, например, "поставщик" на языке Perl формирует список статей для обработки, а "потребитель" на Python производит необходимые действия в автоматическом режиме. При этом потребитель после прерывания работы, может продолжить работу с того места, где был прерван.
Специфика для данной задачи:
- имена файлов-элементов - соотв. названиям статей для обработки; символы, запрещенные для данной файловой системы - заэскеплены, возможно добавлен суффикс для уникальности
- первая строчка файла - название статьи в utf-8
- вторая и последующие строчки файла - содержимое статьи или параметры, специфичные для действия
Сценарий для менеджера закачек
Также рассматривается идея реализации на базе fsqueue менеджера http-закачек:
- в качестве "поставщика" могут использоваться:
- пользовательская GUI-программа работающая через локальную папку файловой системы
- webDAV-клиент, работающий через webDAV-доступную по сети папку
- в качестве потребителя могут использоваться:
- простейшая оболочка на скриптовом языке (например Perl) для циклического запуска качалки
- wget
- преобразователь для mldonkey
- torrent-client
- простейшая оболочка на скриптовом языке (например Perl) для циклического запуска качалки
Специфика для данной задачи:
- имя элемента - имя скачиваемого файла, возможно с генерируемым суффиксом, гарантирующим уникальность
- первая строчка файла - URL-адрес файла для закачки
- последующие строчки файла - параметры, специфичные для данного элемента, в виде пары ключ=значение