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 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.
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.
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.
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.
Pulse is licensed under the MIT license. See LICENSE for the full license text.
See CONTRIBUTING for details on submitting patches and the contribution workflow.
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.
Pulse was originally created by Raphael Simon.