Principles

Message passing system

Systems (usually based on Actor model) that communicate through message passing, meaning that interactions are done by sending encapsulated data packets, which may have any arbitrary intents and semantics. this may be used to decouple execution stages both in time and space, so execution can continue on a different machine, or a different time on the same or another machine.

Event driven system

A specific form of message passing that always uses events as messages. Events are first class citizens of the system, and in a pure eda system, events are reasons and facts; meaning that nothing happens unless there is exactly one event for it.

Event sourcing

It is a persistence strategy that takes EDA to its extreme, where any change to any data is due to events. For any component, where all changes to its data satisfy the following criteria, we call it event sourced.

Note that this is not an architecture as opposed to EDA which is, ES is considered a local persistence strategy, and it must be totally transparent and isolated from external systems.

CQRS

it is the idea of applying CQS principle to whole sub-systems, meaning that responsibility for handling commands are totally separated from handling queries. it is a useful pattern for following scenarios:

Note that this is also a local pattern, not an architecture, and almost always is not a replacement for crud systems.
Also CQRS doesn't have to mean doing event sourcing, introducing commands, event, read sides, sagas, async processing and so forth.

Actor model

The actor model in computer science is a mathematical model of concurrent computation that treats actor as the universal primitive of concurrent computation. In response to a message it receives, an actor can:

Actors may modify their own private state, but can only affect each other indirectly through messaging.

Misconceptions and anti-patterns

Communicating using journal

using events to communicate; this is by far most spread misconception! that is message passing, not event sourcing.

CQRS architecture

as described earlier, CQRS is not a system architecture, it is a local application architecture or pattern; having a system with CQRS architecture not only does not convey any meaning, it also shows a form a cargo cult programming and design.

Event sourced architecture

as described in CQRS architecture! in a properly designed systems (using DDD principles at least) domains are separated by domain language (ubiquitous language) which is the boundary of meanings, this is where data in presence of a domain context becomes meaningful (a.k.a. information) and its semantics are defined, this is a totally private data and not isolating it is the cause of a lot of other misconceptions in DDD/ES designing.

Redundant events

Events are meant to carry facts, having redundant events can signal wrong usage of events or wrong event structure

Dependent events

Events are facts, if they are dependent on other events to be true or not, they are not events

Passive aggressive events

IHaveDoneMyWorkSoShouldDoThisJobEventHappened, DoThisJob. this is a sign of not understanding EDA, and trying to fit an event driven system to an imperative and/or micromanaging mindset.