PPS

Устойчивая служба публикации/подписки (Persistent Publish/Subscribe, PPS)

Устойчивая служба публикации/подписки (Persistent Publish/Subscribe,PPS) – это небольшая расширяемая служба, которая обеспечивает хранение опубликованных данных при перезагрузке компьютера. Она реализована для обеспечения простого в использовании решения как для публикации/подписки, так и для устойчивого хранения данных, в таких встроенных системах, которые требуют связи между независимыми программными подсистемами посредством асинхронных публикаций и уведомлений.

Устойчивость
Поведение при запуске
Поведение при завершении
Объекты PPS
Файлы объектов
Извещения об изменениях
Опции и квалификаторы
Публикация
Несколько издателей
Подписка
Режимы подписки
Подписка на несколько объектов
Группы извещений

При использовании PPS публикация является асинхронной: подписчик не ждет издателя. Точнее говоря, издатель и подписчик редко знают друг о друге; единственная связь между ними — это некоторый объект, который известен обоим.

Реализация PPS во многом похожа на системы управления, в которых объектами являются переменные, обновляемые аппаратным или программным обеспечением. Подписчиками могут быть средства обработки уведомлений о событиях, средства отображения и т.п. А поскольку каждый объект существует только в одном экземпляре, то его устойчивость путем сохранения в энергонезависимой памяти реализуется естественным образом.

Устойчивость

Служба PPS во время функционирования хранит объекты в ОЗУ. При этом она, при необходимости, выполняет следующие действия:

Для энергонезависимого хранилища PPS использует надежную файловую систему, например:

Поведение при запуске

При запуске PPS сразу же формирует иерархию каталога, используя имена файлов из энергонезависимой файловой системы. Загрузка объектов в эти каталоги откладывается до первого доступа к ним. Этот доступ может быть вызовом open() на некотором объекте PPS либо вызовом readdir() на каталоге PPS.

Поведение при завершении

При завершении работы PPS всегда сохраняет все модифицированные объекты в энергонезависимой памяти. Можно в любой момент заставить PPS выполнить сохранение объекта с помощью вызова fsync() на этом объекте. При сохранении в энергонезависимую память PPS все объекты помещает в один каталог.


Note: При необходимости можно указать PPS не сохранять определенные объекты или определенные атрибуты объекта.

Объекты PPS

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

Файлы объектов

Объекты PPS существуют в специальной файловой системе PPS в виде файлов с атрибутами. По умолчанию объекты PPS помещаются в каталог /fs/pps.

При этом пользователь может:

Каталоги PPS могут содержать такие специальные объекты как .all и .notify, которые могут открываться приложениями, чтобы задействовать поведение подписки.

Извещения об изменениях

Когда PPS создает, удаляет или изменяет размер объекта (файла или каталога), он помещает строку извещения в очередь каждого подписчика или издателя, которые открыли либо этот объект, либо специальный объект каталога .all, содержащего изменяемый объект. Файл может быть открыт в полном режиме или в режиме «дельта».

Опции и квалификаторы

PPS поддерживает опции открытия путевых имен, а также квалификаторы объектов и атрибутов. PPS применяет опции открытия путевых имен к файловым дескрипторам, используемым для открытия объектов. Квалификаторы объектов и атрибутов задают особые действия, которые должны выполняться с объектом или атрибутом; например, сделать объект не хранимым или удалить атрибут.

Опции открытия путевых имен

Объекты PPS поддерживают расширенный синтаксис для путевых имен, используемых для их открытия. Эти опции задаются в виде суффиксов, добавляемых к путевому имени после вопросительного знака ("?"). Таким образом, сервис PPS рассматривает любые данные, следующие за путевым именем, как опции, применяемые к файловому дескриптору, используемому для доступа к объекту. При необходимости задать несколько опций их разделяют вопросительными знаками.

Квалификаторы объектов и атрибутов

Квалификаторы могут задаваться при вызовах read() и write() путём указания в начале строки, содержащей имя объекта или атрибута, квалификаторов, состоящих из одной буквы или цифры, заключенных в квадратные скобки.

Публикация

Для публикации с помощью объекта PPS издатель просто вызывает open() для файла этого объекта с параметром O_WRONLY (для публикации) или O_RDWR (для публикации и подписки). Затем издатель может вызывать write() для модификации атрибутов объектов. Эта операция является неблокирующей.

Несколько издателей

PPS позволяет нескольким издателем использовать для публикаций один и тот же объект PPS. Эта возможность требуется потому, что разные издатели могут иметь доступ к данным, связанным с разными атрибутами того же объекта.

В мультимедийных системах, например, io-media может быть установлен начальный атрибут время::значение (time::value), при начальном атрибуте HMI длительность::значение (duration::value). Издатель, изменяющий только атрибут времени, обновляет только его, затем присваивает его объекту. Остальные атрибуты остаются неизмененными.

Подписка

Клиенты PPS могут подписываться на несколько объектов, а объекты PPS могут иметь несколько подписчиков. Когда издатель изменяет объект, все клиенты, подписавшиеся на этот объект, будут проинформированы об этом изменении.

Для подписки на какой-либо объект клиент просто вызывает open() для объекта с флагом O_RDONLY (для подписки) или O_RDWR (для публикации и подписки). Затем подписчик может запрашивать объект вызовом read().

Режимы подписки

Подписчик может открывать объект в полном режиме, в режиме «дельта» или в обоих режимах сразу. Рисунок ниже иллюстрирует разницу в информации, посылаемой подписчикам, которые открыли объект PPS в полном режиме (Full) и «дельта» (Delta). Во всех случаях PPS поддерживает стабильность постоянных объектов.

10_1.png
Рисунок 1. Полный режим и «дельта» режим подписки в PPS


Note: Режим, используемый при открытии объекта, не влияет на объект; он только определят представление объекта с точки зрения подписчика.

Полный режим

В полном режиме (он используется по умолчанию) подписчик всегда получает одиночную, целостную версию всего объекта в том виде, в котором он существовал в момент, когда он был запрошен.

Если издатель модифицирует объект несколько раз до того, как подписчик запросит его, то подписчик получит состояние объекта только в момент запроса. Если объект снова изменится, то подписчик снова будет извещен об изменениях. Т.е. в режиме «Полный» подписчик может пропустить несколько изменений объекта — тех изменений, которые произошли до того, как подписчик сделал запрос к объекту.

Режим «Дельта»

В режиме «Дельта» подписчик получает только изменения (но все изменения) атрибутов объекта. При первом чтении, поскольку подписчик ничего не знает о состоянии объекта, PPS ведет себя так, как будто было изменено все. Следовательно, первое чтение подписчиком в режиме «Дельта» возвращает все атрибуты объекта, в то время как последующие операции чтения, выполняемые подписчиком, возвращают только изменения, произошедшие после предыдущих операций чтения. Таким образом, в режиме «Дельта» подписчик получает все изменения, произошедшие с объектом.

Подписка на несколько объектов

PPS использует каталоги в качестве естественного механизма группировки как для простоты, так и для удобства подписки на несколько объектов. Подписчики могут открыть несколько объектов либо вызывая open() и затем select() на необходимых объектах, либо, еще проще, открывая специальный объект .all, который объединяет все объекты в данном каталоге.

Группы извещений

PPS предоставляет механизм, позволяющий ассоциировать набор файловых дескрипторов с группой извещения. Этот механизм позволяет читать один специальный объект извещений PPS для получения уведомлений об изменении всех объектов, ассоциированных с группой извещения.




Предыдущий раздел: перейти