Устойчивая служба публикации/подписки (Persistent Publish/Subscribe, PPS)
Устойчивая служба публикации/подписки (Persistent Publish/Subscribe,PPS) – это небольшая расширяемая служба, которая обеспечивает хранение опубликованных данных при перезагрузке компьютера. Она реализована для обеспечения простого в использовании решения как для публикации/подписки, так и для устойчивого хранения данных, в таких встроенных системах, которые требуют связи между независимыми программными подсистемами посредством асинхронных публикаций и уведомлений.
При использовании PPS публикация является асинхронной: подписчик не ждет издателя. Точнее говоря, издатель и подписчик редко знают друг о друге; единственная связь между ними — это некоторый объект, который известен обоим.
Реализация PPS во многом похожа на системы управления, в которых объектами являются переменные, обновляемые аппаратным или программным обеспечением. Подписчиками могут быть средства обработки уведомлений о событиях, средства отображения и т.п. А поскольку каждый объект существует только в одном экземпляре, то его устойчивость путем сохранения в энергонезависимой памяти реализуется естественным образом.
Служба PPS во время функционирования хранит объекты в ОЗУ. При этом она, при необходимости, выполняет следующие действия:
Для энергонезависимого хранилища PPS использует надежную файловую систему, например:
При запуске PPS сразу же формирует иерархию каталога, используя имена файлов из энергонезависимой файловой системы. Загрузка объектов в эти каталоги откладывается до первого доступа к ним. Этот доступ может быть вызовом open() на некотором объекте PPS либо вызовом readdir() на каталоге PPS.
При завершении работы PPS всегда сохраняет все модифицированные объекты в энергонезависимой памяти. Можно в любой момент заставить PPS выполнить сохранение объекта с помощью вызова fsync() на этом объекте. При сохранении в энергонезависимую память 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 поддерживает стабильность постоянных объектов.
![]() | Режим, используемый при открытии объекта, не влияет на объект; он только определят представление объекта с точки зрения подписчика. |
Полный режим
В полном режиме (он используется по умолчанию) подписчик всегда получает одиночную, целостную версию всего объекта в том виде, в котором он существовал в момент, когда он был запрошен.
Если издатель модифицирует объект несколько раз до того, как подписчик запросит его, то подписчик получит состояние объекта только в момент запроса. Если объект снова изменится, то подписчик снова будет извещен об изменениях. Т.е. в режиме «Полный» подписчик может пропустить несколько изменений объекта — тех изменений, которые произошли до того, как подписчик сделал запрос к объекту.
Режим «Дельта»
В режиме «Дельта» подписчик получает только изменения (но все изменения) атрибутов объекта. При первом чтении, поскольку подписчик ничего не знает о состоянии объекта, PPS ведет себя так, как будто было изменено все. Следовательно, первое чтение подписчиком в режиме «Дельта» возвращает все атрибуты объекта, в то время как последующие операции чтения, выполняемые подписчиком, возвращают только изменения, произошедшие после предыдущих операций чтения. Таким образом, в режиме «Дельта» подписчик получает все изменения, произошедшие с объектом.
PPS использует каталоги в качестве естественного механизма группировки как для простоты, так и для удобства подписки на несколько объектов. Подписчики могут открыть несколько объектов либо вызывая open() и затем select() на необходимых объектах, либо, еще проще, открывая специальный объект .all
, который объединяет все объекты в данном каталоге.
PPS предоставляет механизм, позволяющий ассоциировать набор файловых дескрипторов с группой извещения. Этот механизм позволяет читать один специальный объект извещений PPS для получения уведомлений об изменении всех объектов, ассоциированных с группой извещения.
Предыдущий раздел: перейти