Skip to content

goadesign/pulse

Repository files navigation

Pulse

Pulse consists of a set of packages that enable event driven distributed architectures at scale. Each package is designed to be used independently but they can also be combined to implement more complex architectures.

Replicated Maps

Replicated maps provide a mechanism for sharing data across distributed nodes and receiving events when the data changes.

%%{init: {'themeVariables': { 'edgeLabelBackground': '#7A7A7A'}}}%%
flowchart LR
    A[Node A]
    B[Node B]
    Map[Replicated Map]
    A-->|Set|Map
    Map-.->|Update|B

    classDef userCode fill:#9A6D1F, stroke:#D9B871, stroke-width:2px, color:#FFF2CC;
    classDef pulse fill:#25503C, stroke:#5E8E71, stroke-width:2px, color:#D6E9C6;

    class A,B userCode;
    class Map pulse;

    linkStyle 0 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 1 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;

See the rmap package README for more details.

Streaming

Pulse streams provide a flexible mechanism for routing events across a fleet of microservices. Streams can be used to implement pub/sub, fan-out and fan-in topologies.

%%{init: {'themeVariables': { 'edgeLabelBackground': '#7A7A7A'}}}%%
flowchart LR
    A[Event Producer]
    subgraph SA[Stream A]
        TA[Topic]
    end
    subgraph SB[Stream B]
        TB[Topic]
    end
    B[Event Consumer]
    A-->|Add|TA
    A-->|Add|TB
    TA-.->|Event|B
    TB-.->|Event|B

    classDef userCode fill:#9A6D1F, stroke:#D9B871, stroke-width:2px, color:#FFF2CC;
    classDef pulse fill:#25503C, stroke:#5E8E71, stroke-width:2px, color:#D6E9C6;

    class A,B userCode;
    class SA,SB,TA,TB pulse;

    linkStyle 0 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 1 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 2 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 3 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;

See the streaming package README for more details.

Dedicated Worker Pool

Pulse builds on top of replicated maps and streaming to implement a dedicated worker pool where jobs are dipatched to workers based on their key and a consistent hashing algorithm.

%%{init: {'themeVariables': { 'edgeLabelBackground': '#7A7A7A'}}}%%
flowchart LR
    A[Job Producer]
    subgraph Pool[Pool Node]
        Sink
    end
    subgraph Worker[Pool Node]
        Reader
        B[Worker]
    end
    A-->|Job+Key|Sink
    Sink-.->|Job|Reader
    Reader-.->|Job|B

    classDef userCode fill:#9A6D1F, stroke:#D9B871, stroke-width:2px, color:#FFF2CC;
    classDef pulse fill:#25503C, stroke:#5E8E71, stroke-width:2px, color:#D6E9C6;

    class A,B userCode;
    class Pool,Sink,Reader,Worker pulse;

    linkStyle 0 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 1 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;
    linkStyle 2 stroke:#DDDDDD,color:#DDDDDD,stroke-width:3px;

See the pool package README for more details.

Examples

See the examples directory for examples of how to use the packages in this repository.

If you are looking for a more complete example of how to use Pulse to build a distributed system, check out the weather example.

License

Pulse is licensed under the MIT license. See LICENSE for the full license text.

Contributing

See CONTRIBUTING for details on submitting patches and the contribution workflow.

Code of Conduct

This project adheres to the Contributor Covenant code of conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to pulse@goa.design.

Credits

Pulse was originally created by Raphael Simon.