How to use KurrentDB as the event store¶
Replace the in-memory store with KurrentDB (formerly EventStoreDB) for durable event persistence.
Install¶
go get github.com/terraskye/eventsourcing/eventstore/kurrentdb
go get github.com/terraskye/eventsourcing/eventbus/kurrentdb
Event store¶
import (
"github.com/terraskye/eventsourcing/eventstore/kurrentdb"
)
store, err := kurrentdb.NewEventStore("esdb://localhost:2113?tls=false")
if err != nil {
log.Fatal(err)
}
defer store.Close()
The connection string follows the EventStoreDB URI format. Pass your existing EventStore consumers (command handlers, query handlers) the store as usual — no changes needed.
Register events before using the store¶
KurrentDB serializes events to JSON. You must register all event types before reading or writing:
eventsourcing.RegisterEvent(&events.TaskCreated{})
eventsourcing.RegisterEvent(&events.TaskCompleted{})
eventsourcing.RegisterEvent(&events.TaskArchived{})
See How to register events for details.
Event bus¶
The KurrentDB event bus uses persistent subscriptions to deliver events reliably, with at-least-once semantics and automatic reconnection.
import (
kurrentbus "github.com/terraskye/eventsourcing/eventbus/kurrentdb"
)
bus, err := kurrentbus.NewEventBus("esdb://localhost:2113?tls=false")
if err != nil {
log.Fatal(err)
}
defer bus.Close()
// Subscribe — the subscription name is used as the consumer group name in KurrentDB.
err = bus.Subscribe(ctx, "task-list-projector", projector.EventHandlers())
Subscriptions are durable: if your service restarts, KurrentDB resumes from where it left off.
Filter events per subscriber¶
The EventGroupProcessor implements StreamFilter() which returns the list of event type names handled by the group. The KurrentDB event bus uses this to subscribe only to relevant event streams, avoiding unnecessary traffic.
Differences from in-memory¶
| Feature | In-memory | KurrentDB |
|---|---|---|
| Persistence | No | Yes |
| Event bus delivery | In-process channel | Persistent subscription |
Events() channel |
Yes | No (use bus) |
| Registration required | No | Yes |
| At-least-once delivery | N/A | Yes |
Running KurrentDB locally¶
docker run --rm -d \
-p 2113:2113 \
-e EVENTSTORE_INSECURE=true \
kurrent/kurrentdb:latest --insecure
Admin UI: http://localhost:2113