eventsourced-object
A minimal eventsourcing helper for objects and classes.
In case you don't know eventsourcing, here's some reading material
var Aggregate =
Api
Aggregate.setup(obj, reducer, events)
var user = version: 0var initialEvents = name: 'CreateUser' fullName: 'Marc Bachmann'Aggregate { stateversion += 1 if evtname == 'CreateUser' statename = evtfullName}
Aggregate.event(obj, reducer, event)
var user = Aggregatevar event = name: 'CreateUser' fullName: 'Marc Bachmann'Aggregateeventuser reducer event// executes the reducer with the event and queues the event so you can save it { stateversion += 1 if evtname == 'CreateUser' statename = evtfullName}
Aggregate.drain(obj)
var obj = {}AggregateAggregateeventobj reducer foo: 'bar'Aggregateeventobj reducer foo: 'test'Aggregate // returns [{foo: 'bar'}, {foo: 'test'}]
Aggregate.isDirty(obj)
var obj = {}AggregateAggregateeventobj reducer foo: 'bar'Aggregate // returns true
Example using a class
var user = Useruser// user == {// id: 'iuxswpqw',// email: 'foo@example.com',// fullName: 'Example',// createdAt: Mon Oct 31 2016 09:26:02 GMT+0100 (CET),// updatedAt: Mon Oct 31 2016 09:26:03 GMT+0100 (CET)//} { thisversion = 0 Aggregate} User { var user = return Aggregateeventuser reducer aggregateId: paramsid || Date name: 'UserCreated' time: data: email: paramsemail fullName: paramsfullName } Userprototype { return Aggregateeventthis reducer aggregateId: thisid name: 'UserRenamed' time: data: fullName: fullName } Userprototype { var events = Aggregate console // Save events to some storage/repository} Userprototype { return Aggregate} { stateversion += 1 stateupdatedAt = evttime if evtname === 'UserCreated' stateid = evtaggregateId statecreatedAt = evttime statefullName = evtdatafullName stateemail = evtdataemail else if evtname === 'UserRenamed' statefullName = evtdatafullName }
Benchmarks
Here are some benchmarks with 10'000'000 iterations per function
NANOBENCH version 1
# raw object creation (for comparison)
end ~97 ms (0 s + 97465524 ns)
# .setup(obj)
end ~228 ms (0 s + 227954858 ns)
# .event(obj, reducer, event)
end ~473 ms (0 s + 473181583 ns)
# .isDirty(obj)
end ~86 ms (0 s + 86072337 ns)
# total ~885 ms (0 s + 884674302 ns)
# ok
[Finished in 1.0s]
Event Sourcing
Videos
- https://www.youtube.com/watch?v=JHGkaShoyNs
- http://www.infoq.com/presentations/greg-young-unshackle-qcon08
- https://www.youtube.com/watch?v=whCk1Q87_ZI
- https://www.youtube.com/watch?v=I4A5ntHeoxU
Reading material
- http://cqrs.nu/
- https://ookami86.github.io/event-sourcing-in-practice/
- https://nicolaswidart.com/blog/get-up-and-running-with-event-sourcing
- http://danielwhittaker.me/2014/11/15/aggregate-root-cqrs-event-sourcing/
- http://docs.geteventstore.com/introduction/event-sourcing-basics/
- https://abdullin.com/tags/cqrs/
- https://abdullin.com/post/event-sourcing-projections/
- http://slides.com/stefankutko/nodejs-microservices-event-sourcing-cqrs
- http://blog.zilverline.com/2012/07/04/simple-event-sourcing-introduction-part-1/
- http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-i-of-ii/
- http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf
- https://groups.google.com/forum/#!forum/dddcqrs