Home / books / learning-larc / diagrams / 05-pan-bus

PAN Bus Communication Patterns

Pub/Sub Architecture

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#764ba2','tertiaryColor':'#48bb78'}}}%%
graph TB
    subgraph Publishers["๐Ÿ“ค Publishers"]
        P1["๐Ÿ”˜ Login Button"]
        P2["๐Ÿ›’ Cart Component"]
        P3["๐Ÿ”Œ API Service"]
    end

    subgraph PAN["๐ŸšŒ PAN Bus"]
        Router["๐Ÿ“ก Topic Router"]

        subgraph Topics["๐Ÿ“‹ Topics"]
            T1["๐Ÿ”‘ user.login"]
            T2["โž• cart.item.added"]
            T3["๐Ÿ“ฆ data.loaded"]
        end
    end

    subgraph Subscribers["๐Ÿ“ฅ Subscribers"]
        S1["๐Ÿ‘ค User Menu"]
        S2["๐Ÿ“ Sidebar"]
        S3["๐Ÿ”” Notification"]
        S4["๐Ÿ“Š Analytics"]
    end

    P1 -->|๐Ÿ“ข publish| T1
    P2 -->|๐Ÿ“ข publish| T2
    P3 -->|๐Ÿ“ข publish| T3

    T1 --> Router
    T2 --> Router
    T3 --> Router

    Router -->|๐Ÿ“ฌ notify| S1
    Router -->|๐Ÿ“ฌ notify| S2
    Router -->|๐Ÿ“ฌ notify| S3
    Router -->|๐Ÿ“ฌ notify| S4

    classDef publisher fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef pan fill:#764ba2,stroke:#6a3f99,stroke-width:3px,color:#fff,font-weight:bold
    classDef subscriber fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold
    classDef topic fill:#4299e1,stroke:#3182ce,stroke-width:2px,color:#fff

    class P1,P2,P3 publisher
    class Router pan
    class S1,S2,S3,S4 subscriber
    class T1,T2,T3 topic

Message Flow Sequence

%%{init: {'theme':'base', 'themeVariables': { 'actorBkg':'#667eea','actorBorder':'#5568d3','actorTextColor':'#fff','signalColor':'#764ba2','signalTextColor':'#2d3748'}}}%%
sequenceDiagram
    participant LoginBtn as ๐Ÿ”˜ Login Button
    participant PAN as ๐ŸšŒ PAN Bus
    participant UserMenu as ๐Ÿ‘ค User Menu
    participant Sidebar as ๐Ÿ“ Sidebar
    participant Analytics as ๐Ÿ“Š Analytics
    participant API as ๐Ÿ”Œ Backend

    Note over LoginBtn,Analytics: ๐Ÿ–ฑ๏ธ User clicks login button

    LoginBtn->>+PAN: ๐Ÿ“ข publish('user.login.started')
    PAN-->>UserMenu: ๐Ÿ“ฌ notify
    PAN-->>Sidebar: ๐Ÿ“ฌ notify
    Note over UserMenu: โณ Show loading state
    UserMenu->>UserMenu: ๐ŸŽจ Update UI

    LoginBtn->>+API: ๐ŸŒ POST /api/login
    API-->>-LoginBtn: โœ… {token, user}

    LoginBtn->>PAN: ๐Ÿ“ข publish('user.login.success', {user})

    PAN-->>UserMenu: ๐Ÿ“ฌ notify
    PAN-->>Sidebar: ๐Ÿ“ฌ notify
    PAN-->>-Analytics: ๐Ÿ“ฌ notify

    Note over UserMenu,Sidebar: ๐ŸŽจ Update with user data
    UserMenu->>UserMenu: ๐Ÿ‘ค Update with user data
    Sidebar->>Sidebar: ๐Ÿ“ฑ Show user panel
    Analytics->>API: ๐Ÿ“Š Track event

Topic Namespace Structure

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#48bb78','tertiaryColor':'#4299e1'}}}%%
graph TB
    Root["๐ŸŒŸ *<br/>All Events"]

    Root --> User["๐Ÿ‘ค user.*"]
    Root --> Cart["๐Ÿ›’ cart.*"]
    Root --> App["๐Ÿ“ฑ app.*"]

    User --> UserAuth["๐Ÿ” user.auth.*"]
    User --> UserProfile["๐Ÿ“‹ user.profile.*"]

    UserAuth --> Login["๐Ÿ”‘ user.auth.login"]
    UserAuth --> Logout["๐Ÿšช user.auth.logout"]
    UserAuth --> Refresh["๐Ÿ”„ user.auth.refresh"]

    UserProfile --> ProfileUpdate["โœ๏ธ user.profile.update"]
    UserProfile --> ProfileFetch["๐Ÿ“ฅ user.profile.fetch"]

    Cart --> CartItem["๐Ÿ“ฆ cart.item.*"]
    Cart --> CartCheckout["๐Ÿ’ณ cart.checkout"]

    CartItem --> ItemAdd["โž• cart.item.add"]
    CartItem --> ItemRemove["โž– cart.item.remove"]
    CartItem --> ItemUpdate["๐Ÿ”„ cart.item.update"]

    App --> AppTheme["๐ŸŽจ app.theme.change"]
    App --> AppRoute["๐Ÿงญ app.route.change"]
    App --> AppError["โš ๏ธ app.error"]

    classDef root fill:#764ba2,stroke:#6a3f99,stroke-width:4px,color:#fff,font-weight:bold
    classDef namespace fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef event fill:#48bb78,stroke:#38a169,stroke-width:2px,color:#fff

    class Root root
    class User,Cart,App,UserAuth,UserProfile,CartItem namespace
    class Login,Logout,Refresh,ProfileUpdate,ProfileFetch,ItemAdd,ItemRemove,ItemUpdate,AppTheme,AppRoute,AppError,CartCheckout event

Wildcard Subscription Matching

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#48bb78','tertiaryColor':'#f56565'}}}%%
graph LR
    subgraph Events["๐Ÿ“ก Published Events"]
        E1["๐Ÿ”‘ user.login"]
        E2["๐Ÿšช user.logout"]
        E3["โœ๏ธ user.profile.update"]
        E4["โž• cart.item.add"]
    end

    subgraph Subs["๐Ÿ“ฅ Subscriptions"]
        S1["๐ŸŽฏ subscribe('user.login')"]
        S2["๐Ÿ‘ค subscribe('user.*')"]
        S3["๐Ÿ”„ subscribe('*.update')"]
        S4["๐ŸŒŸ subscribe('*')"]
    end

    E1 -.โœ… matches.-> S1
    E1 -.โœ… matches.-> S2
    E1 -.โœ… matches.-> S4

    E2 -.โœ… matches.-> S2
    E2 -.โœ… matches.-> S4

    E3 -.โœ… matches.-> S2
    E3 -.โœ… matches.-> S3
    E3 -.โœ… matches.-> S4

    E4 -.โœ… matches.-> S4

    classDef event fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef specific fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold
    classDef catchall fill:#f56565,stroke:#e53e3e,stroke-width:3px,color:#fff,font-weight:bold

    class E1,E2,E3,E4 event
    class S1,S2,S3 specific
    class S4 catchall

Request/Response Pattern

%%{init: {'theme':'base', 'themeVariables': { 'actorBkg':'#667eea','actorBorder':'#5568d3','actorTextColor':'#fff','signalColor':'#764ba2'}}}%%
sequenceDiagram
    participant Requester as โš™๏ธ Component A
    participant PAN as ๐ŸšŒ PAN Bus
    participant Responder as ๐Ÿ” Auth Service

    Note over Responder: ๐Ÿ“ Registers responder
    Responder->>PAN: ๐ŸŽฏ respond('auth.token.get', handler)

    Note over Requester: ๐Ÿ”‘ Needs auth token
    Requester->>+PAN: โ“ request('auth.token.get')

    PAN->>PAN: ๐Ÿ†” Generate response ID
    PAN->>+Responder: โ–ถ๏ธ Trigger handler

    Note over Responder: ๐Ÿ’พ Get token from storage
    Responder->>Responder: ๐Ÿ” Get token from storage
    Responder->>-PAN: ๐Ÿ“ค publish response

    PAN->>-Requester: โœ… Return token

    Note over Requester: ๐ŸŒ Uses token for API call
    Requester->>API: ๐Ÿ”Œ GET /api/data<br/>Authorization: Bearer {token}

Event Patterns Comparison

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#764ba2','tertiaryColor':'#48bb78'}}}%%
graph TB
    subgraph FF["๐Ÿ“ข Fire and Forget"]
        FF1["๐Ÿ“ค Publisher"]
        FF2["๐ŸšŒ PAN Bus"]
        FF3["๐Ÿ“ฅ Subscribers"]

        FF1 -->|๐Ÿ“ข publish| FF2
        FF2 -->|๐Ÿ“ฌ notify all| FF3
        FF1 -.-x|โšก no wait| FF3
    end

    subgraph RR["โ“ Request/Response"]
        RR1["โ“ Requester"]
        RR2["๐ŸšŒ PAN Bus"]
        RR3["๐Ÿ’ฌ Responder"]

        RR1 -->|โ“ request| RR2
        RR2 -->|โ–ถ๏ธ invoke| RR3
        RR3 -->|โœ… respond| RR2
        RR2 -->|๐Ÿ“ฆ return| RR1
    end

    subgraph CMD["โš™๏ธ Command"]
        C1["๐Ÿ‘จโ€๐Ÿ’ผ Commander"]
        C2["๐ŸšŒ PAN Bus"]
        C3["โš™๏ธ Handler"]

        C1 -->|๐Ÿ“‹ command| C2
        C2 -->|โ–ถ๏ธ execute| C3
        C3 -->|โœ… acknowledge| C2
        C2 -.๐Ÿ’ฌ optional.-> C1
    end

    classDef bus1 fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef bus2 fill:#764ba2,stroke:#6a3f99,stroke-width:3px,color:#fff,font-weight:bold
    classDef bus3 fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold

    class FF2 bus1
    class RR2 bus2
    class C2 bus3

PAN Bus Internal Architecture

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#764ba2','secondaryColor':'#667eea','tertiaryColor':'#48bb78'}}}%%
graph TB
    subgraph Core["โš™๏ธ PAN Bus Core"]
        Router["๐Ÿ“ก Topic Router"]

        subgraph Registry["๐Ÿ“š Subscription Registry"]
            Exact["๐ŸŽฏ Exact Matches<br/>Mapโ€นtopic, Setโ€นhandlerโ€บโ€บ"]
            Wildcard["๐ŸŒŸ Wildcard Patterns<br/>Array of patterns and handlers"]
        end

        subgraph Queue["๐Ÿ“ฎ Message Queue"]
            EventQueue["๐Ÿ“ฅ Event Queue"]
            Batch["๐Ÿ“ฆ Batch Processor"]
        end

        Router --> Exact
        Router --> Wildcard
        Router --> EventQueue
        EventQueue --> Batch
    end

    subgraph API["๐Ÿ”ง API Methods"]
        Publish["๐Ÿ“ข publish"]
        Subscribe["๐Ÿ“ฅ subscribe"]
        Request["โ“ request"]
        Respond["๐Ÿ’ฌ respond"]
    end

    Publish --> Router
    Subscribe --> Exact & Wildcard
    Request --> Router
    Respond --> Router

    classDef router fill:#764ba2,stroke:#6a3f99,stroke-width:4px,color:#fff,font-weight:bold
    classDef registry fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef queue fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold
    classDef api fill:#4299e1,stroke:#3182ce,stroke-width:2px,color:#fff

    class Router router
    class Exact,Wildcard registry
    class EventQueue,Batch queue
    class Publish,Subscribe,Request,Respond api

Debugging with Event Inspector

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#ed8936','tertiaryColor':'#48bb78'}}}%%
graph TB
    subgraph Application["๐Ÿ“ฑ Application"]
        C1["โš™๏ธ Component 1"]
        C2["โš™๏ธ Component 2"]
        C3["โš™๏ธ Component 3"]
    end

    subgraph PAN["๐ŸšŒ PAN Bus"]
        Router["๐Ÿ“ก Message Router"]
    end

    subgraph Inspector["๐Ÿ” Inspector"]
        Monitor["๐Ÿ‘€ subscribe('*')"]
        Log["๐Ÿ“‹ Event Log"]
        Filter["๐Ÿ”Ž Filter Panel"]
        Viz["๐Ÿ“Š Visualization"]
    end

    C1 -->|๐Ÿ“ข publish| Router
    C2 -->|๐Ÿ“ข publish| Router
    C3 -->|๐Ÿ“ข publish| Router

    Router -->|๐Ÿ“ฌ notify| C1
    Router -->|๐Ÿ“ฌ notify| C2
    Router -->|๐Ÿ“ฌ notify| C3

    Router -.๐Ÿ” all events.-> Monitor
    Monitor --> Log
    Log --> Filter
    Log --> Viz

    classDef component fill:#667eea,stroke:#5568d3,stroke-width:3px,color:#fff,font-weight:bold
    classDef pan fill:#764ba2,stroke:#6a3f99,stroke-width:3px,color:#fff,font-weight:bold
    classDef inspector fill:#ed8936,stroke:#dd6b20,stroke-width:3px,color:#fff,font-weight:bold
    classDef viz fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold

    class C1,C2,C3 component
    class Router pan
    class Monitor,Log,Filter inspector
    class Viz viz

Event Lifecycle

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','primaryTextColor':'#fff','primaryBorderColor':'#5568d3'}}}%%
stateDiagram-v2
    [*] --> Published: ๐Ÿ“ข publish(topic, data)
    Published --> Routing: ๐Ÿงญ Route to subscribers
    Routing --> MatchExact: ๐ŸŽฏ Check exact matches
    Routing --> MatchWildcard: ๐ŸŒŸ Check wildcards

    MatchExact --> Notify: โœ… Found subscribers
    MatchWildcard --> Notify: โœ… Found subscribers

    MatchExact --> Complete: โŒ No matches
    MatchWildcard --> Complete: โŒ No matches

    Notify --> HandleAsync: โšก Async handlers
    Notify --> HandleSync: ๐Ÿ”„ Sync handlers

    HandleAsync --> Complete: โœ…
    HandleSync --> Complete: โœ…

    Complete --> [*]

    note right of Routing
        ๐Ÿ“‹ Look up topic in registry
        ๐ŸŒŸ Match wildcards
        ๐Ÿ“ฅ Collect all handlers
    end note

    note right of Notify
        ๐Ÿ“ž Call each handler
        ๐Ÿ“ฆ Pass message data
        โš ๏ธ Handle errors
    end note

Error Handling in PAN Bus

%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#667eea','secondaryColor':'#f56565','tertiaryColor':'#48bb78'}}}%%
graph TB
    Publisher["๐Ÿ“ค Publisher"]
    PAN["๐ŸšŒ PAN Bus"]

    Publisher -->|๐Ÿ“ข publish| PAN

    PAN --> S1["๐Ÿ“ฅ Subscriber 1"]
    PAN --> S2["๐Ÿ“ฅ Subscriber 2"]
    PAN --> S3["๐Ÿ“ฅ Subscriber 3"]

    S1 -->|โœ… success| End1["โœ…"]
    S2 -->|๐Ÿ’ฅ throws error| Error["โš ๏ธ Error Handler"]
    S3 -->|โœ… success| End3["โœ…"]

    Error -->|๐Ÿ“ log error| Console["๐Ÿ–ฅ๏ธ Console"]
    Error -->|๐Ÿ“ข publish| ErrorTopic["โŒ app.error"]

    ErrorTopic --> ErrorHandler["โš ๏ธ Error Component"]

    Error -.๐Ÿ”„ doesn't stop.-> S3

    classDef success fill:#48bb78,stroke:#38a169,stroke-width:3px,color:#fff,font-weight:bold
    classDef error fill:#f56565,stroke:#e53e3e,stroke-width:3px,color:#fff,font-weight:bold
    classDef pan fill:#764ba2,stroke:#6a3f99,stroke-width:3px,color:#fff,font-weight:bold
    classDef neutral fill:#667eea,stroke:#5568d3,stroke-width:2px,color:#fff

    class End1,End3 success
    class Error,ErrorTopic,ErrorHandler error
    class PAN pan
    class Publisher,S1,S2,S3 neutral