Издатель-подписчик (шаблон проектирования)
Издатель-подписчик (англ. publisher-subscriber или англ. pub/sub) — поведенческий шаблон проектирования передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Вместо этого сообщения делятся на классы и не содержат сведений о своих подписчиках, если таковые есть. Аналогичным образом подписчики имеют дело с одним или несколькими классами сообщений, абстрагируясь от конкретных издателей.
Шаблон издатель-подписчик представляет собой расширение шаблона наблюдатель, в который добавлено описание канала событий (англ. event channel), специально предназначенного для оповещения о событиях[1].
Шаблон издатель-подписчик наряду с близкой ему концепцией очереди сообщений содержится в арсенале средств событийно-ориентированного промежуточного слоя ПО большой системы. Большинство систем передачи сообщений поддерживают в своем API как и модель издатель-подписчик, так и очередь сообщений. Примером такой системы может быть Java Message Service (JMS)[1].
Этот шаблон обеспечивает большую масштабируемость и более динамичную топологию сети.
Фильтрация сообщений
В модели издатель-подписчик подписчики обычно получают только подмножество всех опубликованных сообщений. Процесс отбора сообщений для получения и их обработка называется фильтрацией. Существуют две основных формы фильтрации: основанная на теме (англ. topic) и основанная на содержимом.
В системе, основанной на теме, сообщения публикуются в «темах» или именованных логических каналах. Подписчики в таких системах будут получать все сообщения, опубликованные в темах, на которые они подписались, и все подписчики, подписавшиеся на одну и ту же тему, будут получать те же самые сообщения. Издатель отвечает за определение классов сообщений, на которые подписываются подписчики.
В системе, основанной на содержимом, сообщения доставляются подписчикам только в том случае, если атрибуты или содержимое этих сообщений допускаются подписчиком. В данной системе подписчик отвечает за классификацию сообщений.
Некоторые системы представляют собой гибрид между этими двумя системами: издатель отправляет сообщения в тему, в то время как подписчики регистрируют подписку, основанную на содержимом для одной или более тем.
Топология
Во многих реализациях шаблона издатель-подписчик издатель отправляет сообщения посреднику, который может быть брокером сообщений или шиной. В таком случае подписчики регистрируют подписку с этим брокером, осуществляющим фильтрацию. Брокер, как правило, осуществляет хранение сообщений и пересылку для маршрутизации сообщения от издателя к подписчику. Кроме того, брокер может устанавливать приоритеты сообщениям в очереди сообщений перед их маршрутизацией.
Подписчики могут подписываться на определенные сообщения на этапе написания кода, во время инициализации приложения или во время выполнения. В системах с пользовательским графическим интерфейсом подписчики могут подписываться вручную с помощью команд (таких как нажатие на кнопке). Некоторые фреймворки и ПО используют для подписки конфигурационные файлы в формате XML или JSON, такие файлы читаются во время инициализации. Другие программные системы могут добавлять или удалять подписку во время выполнения, например триггеры баз данных или RSS.
Большинство распределенных систем реального времени стандарта DDS не используют брокеров. Вместо этого каждый издатель и подписчик совместно используют мета-данные друг о друге. Издатель и подписчик кэшируют эту информацию локально и маршрутизируют сообщения, основываясь на этих сведениях.
История
Шаблон издатель-подписчик впервые публично был представлен в 1987 году Ассоциацией по вычислительной технике (ACM) на симпозиуме «Принципы операционных систем» конференции SOSP '87, в статье «Применение виртуальной синхронности в распределенных системах. 123—138»[2] как часть новостной подсистемы Isis Toolkit.
См. также
Примечания
- Hohpe, G. and Woolf, B. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. — Pearson Education, 2012. — P. 106. — ISBN 9780133065107.
- Birman, K. and Joseph, T. «Exploiting virtual synchrony in distributed systems» 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