Single Store?

Is a single store with many streams the recommended way to go?

I will be working on a project that has multiple subsystems added over time.

Should the approach be to put all of the events into the same store and partition it by stream, BC, or something?

Or should there be a separate store installed per subsystem?


Both are options. The larger question is about how you prefer to deploy/manage/scale/etc. obviously things will be simpler in a single store.


Well, the solution needs to support multi-tenant as-a-service (in the cloud), as well as on-site (hosted), single tenant deployment.

The catalog of items is expected to be between 10 and 10000 items per tenant.

Conceivably, there could be hundreds or thousands of users in the aaS offering, each with 10-10000 items listed. Items will be tracked, bought (leased), returned, supported, reported, etc.

Current planned subsystems are personnel management (owner, manager, employee management), catalog management, maintenance (service tickets), financial, marketing (pricing and advertising specials).

My thought is the more common scenario will be install-per-client and not the aaS offering - but my client wants to support both.

The plan is to implement personnel management and catalog management first as these are core, then the maintenance, marketing, and finally financial management (all either COTS or custom depending on features and licensing).

My client has a budget and I am architecting for the purpose of giving them estimates on each piece - and whether they should buy vs build.

Build is going to be the only way to deliver some of their requirements - so they need cost estimates for go/no-go.

The system needs to be extensible out-of-the-box, as well as support reports/audits that only ESing can provide.

Laws dictate that most aspects of the system (ownership, unit description, price, etc) be tracked and capable of being reported on point-in-time scenarios. it has to be provable that “On 5/28/2013, this unit looked like XYZ and was owned/operated by ABC and leased by 123 for the price of $$$”. Plus, the types of reports are very much in-flux. Classing Event Sourcing requirement it seems to me.



In terms of multi-tenant do they need physical or logical separation?

The ones that need physical separation would get a stand-alone install or even on-site.

Multi-tenant can commingle as long as it is secure. Though we would need an easy way to convert from multi to single tenant as necessary.

Multi to single is pretty easy if planned for (eg naming strategy/metadata/etc). Especially for the sizes discussed. Let’s imagine that you wanted a per tenant stream (and you put tenant in metadata)

Fromall().when({$any : function(s,e) { linkto(e.metadata.tenant, e)}}):

If I had a tenant “coca cola” I would then have a stream with all events in it. To move to local just read to copy the stream (they can keep on site read only copy if they want).

Make sense?