# Publish/Subscribe Pattern

> A design pattern in which publishers send messages to a topic and every subscriber to that topic receives them.

Record: `architecture:publish-subscribe-pattern`
Kind: pattern
Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)
Severity: contextual
Scope: integration, eventing
Canonical: https://banes-lab.com/ontology#architecture-publish-subscribe-pattern

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Event-Driven Architecture](https://banes-lab.com/records/architecture/event-driven-architecture.md) and before [Message Queue](https://banes-lab.com/records/architecture/message-queue.md).

## Repair

- Refactored by: Introduce Topic/Event Bus
- Detected by: direct calls to subscriber list
- Violated by: publisher knowing all subscribers
- Measured by: publisher-subscriber coupling
- Enforced by: messaging contracts

## Requires

- [Publisher](https://banes-lab.com/records/lexicon/publisher.md)
- [Subscriber](https://banes-lab.com/records/lexicon/subscriber.md)
- [Broker/Event Bus](https://banes-lab.com/records/lexicon/broker-event-bus.md)

## Reinforces

- [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md)

## Enables

- [Fan-Out Notification](https://banes-lab.com/records/lexicon/fan-out-notification.md)

## Conflicts with

- [Direct Point-to-Point Calls](https://banes-lab.com/records/lexicon/direct-point-to-point-calls.md)

## In tension with

- [Delivery Ordering](https://banes-lab.com/records/lexicon/delivery-ordering.md)

## Tensions

- [Publish/Subscribe Pattern / Delivery Ordering](https://banes-lab.com/records/tension/delivery-ordering-publish-subscribe-pattern.md)

## Severity

- [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)

## Category

- [Event / Messaging / Asynchronous Architecture](https://banes-lab.com/records/architecture-category/event-messaging-asynchronous-architecture.md)

## Linked from

- [Posting and waiting are one operation](https://banes-lab.com/disciplined-methodology/collaborate/posting-and-waiting-are-one-operation.md)
- [Execution joins the halves](https://banes-lab.com/software-architecture/principles/execution-joins-the-halves.md)
- [Core Modular Design](https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md)
- [Event Messaging Async](https://banes-lab.com/ontology/lexicon/lexicon-category-event-messaging-async.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)

## Evidence in the code

- [emitEvent](https://banes-lab.com/source/tree/core/buses/base.bus.ts.md)
- [subscribeEvent](https://banes-lab.com/source/tree/core/buses/base.bus.ts.md)
- [core/buses](https://banes-lab.com/anatomy/tree/folder-core-buses.md)
