Издатель — подписчик (англ. publisher-subscriber; pub/sub) — поведенческий шаблон проектирования передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Вместо этого сообщения делятся на классы и не содержат сведений о своих подписчиках, если таковые есть. Аналогичным образом подписчики имеют дело с одним или несколькими классами сообщений, абстрагируясь от конкретных издателей.

Принципиальная схема механизма «издатель — подписчик» в DDS

Является расширением шаблона «наблюдатель», в который добавлено описание канала событий (англ. event channel), специально предназначенного для оповещения о событиях[1].

Шаблон «издатель — подписчик» наряду с близкой ему концепцией очереди сообщений содержится в арсенале средств событийно-ориентированного связующего программного обеспечения большой системы. Большинство систем передачи сообщений поддерживают в своём API как и модель «издатель — подписчик», так и очередь сообщений. Примером такой системы может быть Java Message Service (JMS)[1].

Этот шаблон обеспечивает большую масштабируемость и более динамичную топологию сети.

Фильтрация сообщений править

В модели «издатель — подписчик» подписчики обычно получают только подмножество всех опубликованных сообщений. Процесс отбора сообщений для получения и их обработка называется фильтрацией. Существуют две основных формы фильтрации: основанная на теме (англ. topic) и основанная на содержимом.

В системе, основанной на теме, сообщения публикуются в «темах» или именованных логических каналах. Подписчики в таких системах будут получать все сообщения, опубликованные в темах, на которые они подписались, и все подписчики, подписавшиеся на одну и ту же тему, будут получать те же самые сообщения. Издатель отвечает за определение классов сообщений, на которые подписываются подписчики.

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

Некоторые системы представляют собой гибрид между этими двумя системами: издатель отправляет сообщения в тему, в то время как подписчики регистрируют подписку, основанную на содержимом для одной или более тем.

Топология править

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

Подписчики могут подписываться на определённые сообщения на этапе написания кода, во время инициализации приложения или во время выполнения. В системах с пользовательским графическим интерфейсом подписчики могут подписываться вручную с помощью команд (таких как нажатие на кнопке). Некоторые фреймворки и ПО используют для подписки конфигурационные файлы в формате XML или JSON, такие файлы читаются во время инициализации. Другие программные системы могут добавлять или удалять подписку во время выполнения, например триггеры баз данных или RSS.

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

История править

Впервые предложен в 1987 году на симпозиуме «Принципы операционных систем» Ассоциации вычислительной техники в докладе «Применение виртуальной синхронности в распределённых системах. 123—138»[2] как часть новостной подсистемы Isis Toolkit.

См. также править

Примечания править

  1. 1 2 Hohpe, G. and Woolf, B. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. — Pearson Education, 2012. — P. 106. — ISBN 9780133065107.
  2. Birman, K. and Joseph, T. «Exploiting virtual synchrony in distributed systems Архивная копия от 13 сентября 2019 на Wayback Machine» in Proceedings of the eleventh ACM Symposium on Operating systems principles (SOSP '87), 1987. pp. 123—138.

Литература править

  • Buschmann, F., Meunier, R., Rohnert, H., Sommerlad, P., & Stal, M. (1996). Pattern Oriented Software Architecture, Volume 1: A System of Patterns. John Wiley & Sons, 1996, pp. 339—343