Even the data stream of a TCP connection is a projection of events, which is why (and how) we can reconstruct them by replaying captured segments.
So just because there are some lousy executions of a general architecture, doesn’t mean we should recoil from the basic idea.
My takeaway is that successful event-sourced structures are crafted for the domain they represent. I’ve developed a couple for my own work, for very specific aspects of an application, and they work well in context.
If your experience has been that a general-purpose ES framework leads to shitty, hard-to-maintain apps, I’d say that’s evidence for the corollary.
Gets more complicated when you add in distributed computing, redundancy etc... However those things are always complicated
I can't shake off the project because it keeps getting stuck to the bottom of my shoe.
However, just because you're using event sourcing doesn't mean you don't have a database with the current state of your entities.
class User < ActiveRecord::Base
has_paper_trail
end
That solution is good enough for most use cases and doesn't require highly skilled architects and developers to implement Event Sourcing properly.Regarding logs, "traditionally", I'd use an audit/change history table for objects that needed one.
This is not very different from what a relational database does with redo logs. In fact, in a way, using event sourcing resembles composing a system from the fundamental building blocks of a traditional DBMS, in a distributed way.