Издатель — подписчик


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

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

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

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

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

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