cluster-event-sourcing

main

akbashev/cluster-event-sourcing

Cluster EventSourcing

An event sourcing framework implementation for Swift distributed Cluster System.

Usage

Documentation: TODO

  1. Currently there is no default store providers, so you need to create one and conform to EventStore protocol. This could be any class, actor and etc.
  2. Install plugins. ClusterJournalPlugin wraps store into singleton, so singleton plugin also should be added (and order is important!).
let node = await ClusterSystem("simple-node") {
    $0.plugins.install(plugin: ClusterSingletonPlugin())
    $0.plugins.install(
        plugin: ClusterJournalPlugin { _ in
            SomeStore()
        }
    )
}
  1. Make distributed actor EventSourced. Provide persistenceID and define the handleEvent(_:) function:
distributed actor SomeActor: EventSourced {

    // Some custom events for actor
    enum Event {
        case doSomething 
    }
    
    // This is important to provide, events are stored per actor using persistenceID
    @ActorID.Metadata(\.persistenceID) 
    var persistenceID: PersistenceID 
    
    distributed func doSomething() async throws {
        try await self.emit(event: .doSomething)
    }
    
    distributed func handleEvent(_ event: Event) { 
        switch event {
        case .doSomething:
            // update state
        }
    }
    
    init(actorSystem: ClusterSystem) {
        self.actorSystem = actorSystem
        self.persistenceID = "some-actor"
    }
}

Description

  • Swift Tools 5.7.0
View More Packages from this Author

Dependencies

Last updated: Sun Apr 28 2024 05:44:15 GMT-0900 (Hawaii-Aleutian Daylight Time)