Участник: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: блокировки и выбор имени при создании нового элемента в очереди

Сценарии использования

Обобщенный сценарий

Обобщенный сценарий использования механизма -

  1. программа-"поставщик" создает очередь
  2. оператор инспектирует полученную очередь, при необходимости
    • меняя последовательность обработки элементов,
    • добавляя
    • удаляя элементы очереди
  3. оператор запускает программу-"потребитель", для которой очередь является набором входных данных.

Сценарий для mediawiki-ботов

Изначально механизм fsqueue планируется использовать для организации очередей автоматизированной обработки статей в рамках энциклопедии викизнание, при котором, например, "поставщик" на языке Perl формирует список статей для обработки, а "потребитель" на Python производит необходимые действия в автоматическом режиме. При этом потребитель после прерывания работы, может продолжить работу с того места, где был прерван.

Специфика для данной задачи:

  • имена файлов-элементов - соотв. названиям статей для обработки; символы, запрещенные для данной файловой системы - заэскеплены, возможно добавлен суффикс для уникальности
  • первая строчка файла - название статьи в utf-8
  • вторая и последующие строчки файла - содержимое статьи или параметры, специфичные для действия


Сценарий для менеджера закачек

Также рассматривается идея реализации на базе fsqueue менеджера http-закачек:

  • в качестве "поставщика" могут использоваться:
    • пользовательская GUI-программа работающая через локальную папку файловой системы
    • webDAV-клиент, работающий через webDAV-доступную по сети папку
  • в качестве потребителя могут использоваться:
    • простейшая оболочка на скриптовом языке (например Perl) для циклического запуска качалки
      • wget
      • преобразователь для mldonkey
      • torrent-client

Специфика для данной задачи:

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

См. также

Инструменты