CQRS EventStore v3.0

The official release for EventStore 3.0 is just around the corner. Following SemVer semantics, this is now version 3.0 instead of 2.1 or whatever. his post is to highlight the differences between 2.0 and 3.0. First and foremost, the packages are available for download here in both .NET 3.5 and .NET 4.0 flavors:

https://github.com/joliver/EventStore/downloads (contains all binaries and plugins for various persistence and serialization methods)

On NuGet, the following packages have been pushed. Because this is a beta, not all of them are marked as "recommended" yet.


Big Changes

  • Paging: The SQL and Raven implementations now support paging automagically. This is to help facilitate queries where large result sets could potentially be returned, e.g. an stream with hundreds or thousands of commits against it or returning all commits since a given point in time. Page size is configurable with sensible defaults. Mongo already supports paging under the hood automatically.
  • Two-phase commit: Perhaps the biggest new feature is support for 2PC. Because *so* many people asked for it, here it is. There are a few big, fat issues to be aware of. First and foremost, your storage engine must support 2PC. That pretty much means SQL Server and Raven. One issue with Raven is that you get one operation per 2PC. This is due to the way Raven handles 2PC and doesn't update its indexes on commits until *after* the full transaction completes. In other words, you can't query and get the stuff you just saved until after the transaction is complete.
  • Most all dependencies are now automatically resolved from the NuGet gallery *at compile time*.
  • The two message "dispatchers"—sync and async—are now called '"dispatch schedulers", therefore the interface IDispatchCommits is now IScheduleDispatches. The associated IPublishMessages (which never felt like a good fit), is now called IDispatchCommits. The associated implementations have changed accordingly.
  • Added logging throughout the library. There's a little bit left to do for logging in Raven and Mongo, but all activities can now be logged. You can output the diagnostic messages to the console, trace window, log4net, or NLog. This can be specified using the "LogTo" wireup overload.
  • Added "SystemTime" abstraction to facilitate testing.
  • Added support to publish packages to NuGet.
  • For those using MySQL, I added an index that was missing—you may want to run this to add the index: CREATE INDEX IX_Commits_Stamp ON Commits (CommitStamp);
  • The SQL implementation will now throw a "StorageUnavailableException" if storage is offline.
  • A few of the interfaces and implementations surrounding SQL persistence have changed—this should only really affect you if you're doing a custom SQL dialect.
  • Raven can now be run be run in Azure without a config file.
  • Fixed a few outstanding issues that had built up in the GitHub issue tracker.

Once this release solidifies, I'll turn my attention to 3.1 (hopefully it'll be a point release). There are some exciting things coming in 3.1 and beyond:

  • Merging in the "essence" of CommonDomain (which was spike code that worked a little too well) into EventStore but with a slightly different model that doesn't violate the spirit and ultimate purpose of either library.
  • Support for Amazon (SimpleDB/S3)
  • Support for Windows Azure (Tables/Blobs)
  • Support for CouchDB
  • Support for Cassandra
  • Support for Redis
  • Support for Oracle
  • Support for Sybase
  • Support for a local, file system-based store.
  • Support for Protocol Buffers and other serialization formats.

In the near future, perhaps after this release or one of the next ones, I will be dropping support for .NET 3.5 entirely. There is a point at which I can't hold this library back any longer from taking advantage of .NET 4.0-specific features. I don't expect any big showstoppers with this beta release. Once I address any feedback I get and have used this in production on my own systems long enough, I plan to push a release by around the first or second week of October.