← Extractions

Event Sourcing Anti-Patterns & Failures — Nathan Ladd at wroclove.rb 2018

Nathan Ladd's wroclove.rb 2018 talk walks through event-sourcing basics (commands, handlers, projections, events) and then dissects four common anti-patterns: entities coupled to messaging, view-biased event schemas, opaque dependencies (hidden projections and opaque writers), and the aggregate-root-as-god-class pattern. He closes with meta-advice about scrutinizing community thought leaders, treating complexity as contextualized, and spending a week or two on real up-front design before coding.

Model
claude-opus-4-7
Ingestion
43cc404e
Input tokens
226,664
fresh
115,868
cached
96,419
cache write
14,377
Output tokens
15,489
Duration
244.2s
Roundtrips
6
Tool calls
17
Cost
$0.00
Nodes/edges extracted
33 / 51
Read set (nodes/edges)
97 / 36

Nodes (33)

update Event Sourcing Anti Patterns and Failures talk
attrs {"type" => "talk"} → {"date" => "2018-03-16", "type" => "talk"}
description Talk at wroclove.rb 2018. → Nathan Ladd's wroclove.rb 2018 talk, delivered as the first event-sourcing talk of the conference. Opens with a revie...
short_description Talk at wroclove.rb 2018. → Nathan Ladd's wroclove.rb 2018 talk on common event-sourcing anti-patterns and failure modes.
update Nathan Ladd person
attrs (empty) → {"role" => "co-principal, Eventide project", "twitter" => "@realntl"}
description Conference speaker. At wroclove.rb 2018 gave a talk critiquing aggregates and their coupling to events, which signifi... → Conference speaker, co-principal / co-founder of the Eventide project (a toolkit for event sourcing and autonomous se...
short_description Ruby conference speaker, Eventide co-maintainer. → Ruby conference speaker; co-principal of the Eventide project.
create Command Message concept
kind (empty) → concept
name (empty) → Command Message
slug (empty) → command-message
attrs (empty) → {"category" => "pattern"}
description (empty) → Ladd's generalized name for a web form or any input handled by an MVC controller: a command message. In event-sourced...
short_description (empty) → A message expressing intent — a generalized name for a web form or controller input.
create Command Handler concept
kind (empty) → concept
name (empty) → Command Handler
slug (empty) → command-handler
attrs (empty) → {"category" => "pattern"}
description (empty) → Component that receives a command message, projects the relevant entity, accepts or rejects the command (usually via ...
short_description (empty) → Entry-point component that receives a command and decides which event(s) to write.
create Entity Projection concept
kind (empty) → concept
name (empty) → Entity Projection
slug (empty) → entity-projection
attrs (empty) → {"category" => "pattern"}
description (empty) → In event sourcing, projecting an entity means reading its stream sequentially starting from a blank/empty data struct...
short_description (empty) → Folding an event stream from empty state into a single entity representation.
create Entity Coupled To Messaging concept
kind (empty) → concept
name (empty) → Entity Coupled To Messaging
slug (empty) → entity-coupled-to-messaging
attrs (empty) → {"category" => "pattern"}
description (empty) → First anti-pattern in Ladd's talk. When an entity method takes a command message as a parameter, decodes its attribut...
short_description (empty) → Anti-pattern: entities that accept command messages, interpret them, and return events.
create View-Biased Event Schemas concept
kind (empty) → concept
name (empty) → View-Biased Event Schemas
slug (empty) → view-biased-event-schemas
attrs (empty) → {"category" => "pattern"}
description (empty) → Second anti-pattern. When building materialized views from events, teams are tempted to shove UI-only data (e.g. cate...
short_description (empty) → Anti-pattern: shaping events to carry UI/view fields rather than raw facts.
create Opaque Dependencies concept
kind (empty) → concept
name (empty) → Opaque Dependencies
slug (empty) → opaque-dependencies
attrs (empty) → {"category" => "pattern"}
description (empty) → Third anti-pattern. Dependencies are 'opaque' when the handler can't see or control them. Two flavors discussed: (1) ...
short_description (empty) → Anti-pattern: hiding projections, writers or other dependencies the handler should control.
create Aggregate Root Anti-Pattern concept
kind (empty) → concept
name (empty) → Aggregate Root Anti-Pattern
slug (empty) → aggregate-root-anti-pattern
attrs (empty) → {"category" => "pattern"}
description (empty) → Fourth anti-pattern in Ladd's talk. A class that mixes entity business logic, command handling, and event projection ...
short_description (empty) → Anti-pattern: a single class mixing entity, handler, and projection responsibilities.
create Reservation Pattern concept
kind (empty) → concept
name (empty) → Reservation Pattern
slug (empty) → reservation-pattern
attrs (empty) → {"category" => "pattern"}
description (empty) → Event-sourcing technique Ladd cites for enforcing uniqueness (e.g. of an email address): write a reservation event ke...
short_description (empty) → Uniqueness validation in event-sourced systems via a reservation event on the shared key.
create Expected Version concept
kind (empty) → concept
name (empty) → Expected Version
slug (empty) → expected-version
attrs (empty) → {"category" => "pattern"}
description (empty) → Optimistic concurrency countermeasure when writing to an event store: the write specifies the expected current versio...
short_description (empty) → Concurrency control parameter on event-store writes used to detect and reject races.
create Vector Clock concept
kind (empty) → concept
name (empty) → Vector Clock
slug (empty) → vector-clock
attrs (empty) → {"category" => "architecture"}
description (empty) → Technical mechanism Ladd names for ordering events produced by distributed systems where a simple timestamp is unreli...
short_description (empty) → Causal-ordering mechanism for events across distributed systems.
create Entity Caching and Snapshotting concept
kind (empty) → concept
name (empty) → Entity Caching and Snapshotting
slug (empty) → entity-caching-and-snapshotting
attrs (empty) → {"category" => "practice"}
description (empty) → Because each event has a position exactly one greater than the previous, an entity projected up to position N can be ...
short_description (empty) → Performance countermeasures for event-stream replay: versioned entity cache and periodic snapshots.
create Contextualized Complexity concept
kind (empty) → concept
name (empty) → Contextualized Complexity
slug (empty) → contextualized-complexity
attrs (empty) → {"category" => "practice"}
description (empty) → Ladd's reframing of the complexity objection to moving off monoliths. Yes, partitioning and event sourcing add patter...
short_description (empty) → Complexity you add to a system but only deal with a small subset of at any time.
create Immutable Database Raises Mistake Cost takeaway
kind (empty) → takeaway
name (empty) → Immutable Database Raises Mistake Cost
slug (empty) → immutable-database-raises-mistake-cost
attrs (empty) → {"type" => "warning"}
description (empty) → Because the event store is immutable, correcting bad data is much harder than in a relational database (where you can...
short_description (empty) → Mistakes in event-sourced systems are far more expensive than in mutable databases.
create Keep Entities Free Of Messaging takeaway
kind (empty) → takeaway
name (empty) → Keep Entities Free Of Messaging
slug (empty) → keep-entities-free-of-messaging
attrs (empty) → {"type" => "recommendation"}
description (empty) → Recommendation: entities should contain only core business logic and be readable as a specification of the domain. Th...
short_description (empty) → Entities should be pure domain logic, not aware of commands or events.
create Events Record What Occurred, Nothing Else takeaway
kind (empty) → takeaway
name (empty) → Events Record What Occurred, Nothing Else
slug (empty) → events-record-what-occurred-nothing-else
attrs (empty) → {"type" => "recommendation"}
description (empty) → Don't bend event schemas to accommodate UI needs. Adding UI-derived fields (e.g. a category_id computed from a heuris...
short_description (empty) → Never add view-only fields to events to make UI composition easier.
create Handlers Must Control Their Dependencies takeaway
kind (empty) → takeaway
name (empty) → Handlers Must Control Their Dependencies
slug (empty) → handlers-must-control-their-dependencies
attrs (empty) → {"type" => "recommendation"}
description (empty) → Handlers must be able to control the projection (for caching, snapshotting, or to skip it entirely) and the writer (t...
short_description (empty) → Command handlers should own their projection and writer, not delegate to framework.
create Don't Conflate Entity, Handler and Projection takeaway
kind (empty) → takeaway
name (empty) → Don't Conflate Entity, Handler and Projection
slug (empty) → don-t-conflate-entity-handler-and-projection
attrs (empty) → {"type" => "recommendation"}
description (empty) → Avoid the aggregate-root-as-god-class pattern. Keeping entity, handler, and projection as separate classes preserves ...
short_description (empty) → Keep entities, handlers, and projections as separate, independently testable classes.
create Scrutinize Community Thought Leaders takeaway
kind (empty) → takeaway
name (empty) → Scrutinize Community Thought Leaders
slug (empty) → scrutinize-community-thought-leaders
attrs (empty) → {"type" => "insight"}
description (empty) → Communities have positive connotations and can achieve wonders (Ladd's Amish barn-raising and Texas hurricane example...
short_description (empty) → Communities and leaders can suppress critical thinking; hold popular ideas under scrutiny.
create A Week Of Up-Front Design Is Not Waterfall takeaway
kind (empty) → takeaway
name (empty) → A Week Of Up-Front Design Is Not Waterfall
slug (empty) → a-week-of-up-front-design-is-not-waterfall
attrs (empty) → {"type" => "recommendation"}
description (empty) → 'Measure twice, cut once.' The move from waterfall to agile replaced 6–18 months of up-front design, but the communit...
short_description (empty) → Closing the laptop to design a service for a week is agile, not waterfall.
create Tooling Never Forced Your Monolith takeaway
kind (empty) → takeaway
name (empty) → Tooling Never Forced Your Monolith
slug (empty) → tooling-never-forced-your-monolith
attrs (empty) → {"type" => "warning"}
description (empty) → Teams that move from Rails to event sourcing sometimes build the same god classes they criticised Rails for. Switchin...
short_description (empty) → Don't blame Rails (or any tool) for your god classes — and don't expect Elixir to fix them.
create Entity Store tool
kind (empty) → tool
name (empty) → Entity Store
slug (empty) → entity-store
attrs (empty) → {"category" => "library"}
description (empty) → One of the 30+ libraries in the Eventide project. Provides projection of entities from event streams, along with an e...
short_description (empty) → Eventide Ruby library implementing entity projection with cache and snapshotting.
create What is an entity? question
kind (empty) → question
name (empty) → What is an entity?
slug (empty) → what-is-an-entity
attrs (empty) → {"answer_summary" => "Primarily a data structure with domain-specific methods; logically, a whole microservice can al...
description (empty) → Audience asks whether an entity is an object with attributes or a process. Ladd: usually a data structure with domain...
short_description (empty) → Q&A clarifying what Ladd means by 'entity' in event sourcing.
create Is the sufficient-funds check a feature envy smell? question
kind (empty) → question
name (empty) → Is the sufficient-funds check a feature envy smell?
slug (empty) → is-the-sufficient-funds-check-a-feature-envy-smell
attrs (empty) → {"answer_summary" => "The conditional belongs in the handler because deciding which event to write is a messaging con...
description (empty) → Audience member (citing 'tell don't ask') objects that the handler asks the account if there are sufficient funds, th...
short_description (empty) → Q&A on whether handler-side querying of the entity violates 'tell don't ask'.
create What is the biggest challenge with this approach? question
kind (empty) → question
name (empty) → What is the biggest challenge with this approach?
slug (empty) → what-is-the-biggest-challenge-with-this-approach
attrs (empty) → {"answer_summary" => "Prototyping speed — event-sourced services never match Rails' sketch-velocity, by design."}
description (empty) → Audience asks what Ladd's biggest current challenge is. Answer: you will never prototype as fast as with Rails. In ma...
short_description (empty) → Q&A on the biggest day-to-day pain of event-sourced services.
create How is the event-write kept consistent with external operations? question
kind (empty) → question
name (empty) → How is the event-write kept consistent with external operations?
slug (empty) → how-is-the-event-write-kept-consistent-with-external-operations
attrs (empty) → {"answer_summary" => "Either the service is authoritative (no external call), or the external call happens in the han...
description (empty) → Audience asks how recording 'withdrawn' stays consistent with the actual withdrawal when an external API (e.g. a wire...
short_description (empty) → Q&A on transactional integrity between event writes and external side effects.
create How do you order events across distributed systems? question
kind (empty) → question
name (empty) → How do you order events across distributed systems?
slug (empty) → how-do-you-order-events-across-distributed-systems
attrs (empty) → {"answer_summary" => "Vector clocks; but teach the underlying ordering problem first."}
description (empty) → Audience notes the event 'time' attribute is just metadata and doesn't imply ordering. They ask how events are ordere...
short_description (empty) → Q&A on event ordering without relying on wall-clock time.
create Do Rails adopters write handlers instead of controller actions? question
kind (empty) → question
name (empty) → Do Rails adopters write handlers instead of controller actions?
slug (empty) → do-rails-adopters-write-handlers-instead-of-controller-actions
attrs (empty) → {"answer_summary" => "Have the controller write a command message to a stream rather than handle it inline; that keep...
description (empty) → Audience asks whether Rails adopters end up writing command handlers instead of controller actions. Ladd: one of thei...
short_description (empty) → Q&A on how Rails teams integrate Eventide into their MVC.
create How do you deal with event versioning? question
kind (empty) → question
name (empty) → How do you deal with event versioning?
slug (empty) → how-do-you-deal-with-event-versioning
attrs (empty) → {"answer_summary" => "Hard problem. In monoliths, version events and branch on read. In microservices, rebuild the se...
description (empty) → Audience asks how to handle evolving event schemas. Ladd: it's a difficult situation. In a monolith, versioning is us...
short_description (empty) → Q&A on changing event schemas after events have been written.
create Centralised vs per-service event store? question
kind (empty) → question
name (empty) → Centralised vs per-service event store?
slug (empty) → centralised-vs-per-service-event-store
attrs (empty) → {"answer_summary" => "A shared physical event store is fine because streams are naturally isolated; split only for op...
description (empty) → Audience asks whether Eventide uses a centralised event store. Ladd: the 'one DB per service' rule comes from relatio...
short_description (empty) → Q&A on whether each microservice should own a separate event store.
create Do events store current state, and how does replay perform? question
kind (empty) → question
name (empty) → Do events store current state, and how does replay perform?
slug (empty) → do-events-store-current-state-and-how-does-replay-perform
attrs (empty) → {"answer_summary" => "Events are raw occurrences; current state is folded. Performance is handled via a version-keyed...
description (empty) → Audience asks whether each event stores the latest state or the change, and how performance is affected when state mu...
short_description (empty) → Q&A on whether events carry latest state and on projection performance.
create How do you deal with GDPR in an immutable event store? question
kind (empty) → question
name (empty) → How do you deal with GDPR in an immutable event store?
slug (empty) → how-do-you-deal-with-gdpr-in-an-immutable-event-store
attrs (empty) → {"answer_summary" => "Model regulatory requirements in the business domain; they aren't a framework concern. Ladd has...
description (empty) → Audience asks about GDPR-style data-protection requirements in immutable stores. Ladd quips that in America you can d...
short_description (empty) → Q&A on handling regulatory requirements like GDPR with event sourcing.

Edges (51)

update Event Sourcing Anti Patterns and Failures → presented_at → wroclove.rb 2018
context (empty) → Delivered as the first event-sourcing talk of wroclove.rb 2018.
update Nathan Ladd → authored → Event Sourcing Anti Patterns and Failures
context (empty) → Nathan Ladd presented the talk as a co-principal of Eventide.
create Nathan Ladd → attended → wroclove.rb 2018
context (empty) → Attended as a speaker.
relation (empty) → attended
source_node_id (empty) → c2047c7c-2316-4c38-af4f-1e8a78f80206
target_node_id (empty) → 9243ef2c-21bb-4f23-b450-9ecd87882dfe
update Nathan Ladd → works_on → Eventide
attrs {"role" => "co-maintainer"} → {"role" => "co-principal"}
context Garofolo names Nathan as co-maintainer of Eventide's Postgres-backed message store. → Co-principal / co-founder of the Eventide project.
update Scott Bell → works_on → Eventide
context Garofolo names Scott Bell as co-maintainer of Eventide's Postgres-backed message store alongside Nathan Ladd. → Ladd credits 'my colleague Scott' as co-builder and disabuser of his bad ideas.
create Event Sourcing Anti Patterns and Failures → about → Event Sourcing
context (empty) → Whole talk is about event sourcing and its anti-patterns.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 687c9da2-de87-4fb2-a758-c7498f394fd5
create Event Sourcing Anti Patterns and Failures → about → Command Message
context (empty) → Opens by reframing web forms and controller inputs as command messages.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 02772774-712b-4af2-9ec4-e4eafa94cb07
create Event Sourcing Anti Patterns and Failures → about → Command Handler
context (empty) → Describes MVC controllers as command handlers and argues handlers must own projection and writing.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → e72326d6-a168-47a5-a1f7-dea8b50d49e3
create Event Sourcing Anti Patterns and Failures → about → Entity Projection
context (empty) → Explains projection as folding an event stream into an entity, and warns against hiding it.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 28ae0d67-fcf9-4a6a-adb3-fb01e56cc520
create Event Sourcing Anti Patterns and Failures → about → Entity Coupled To Messaging
context (empty) → First anti-pattern covered.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 464fbf52-5421-4819-b59c-959db0f9d819
create Event Sourcing Anti Patterns and Failures → about → View-Biased Event Schemas
context (empty) → Second anti-pattern covered.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 1879d94d-1505-48d7-88f5-b6d45eca370a
create Event Sourcing Anti Patterns and Failures → about → Opaque Dependencies
context (empty) → Third anti-pattern, covering opaque projections and opaque writers.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → f7438446-2e23-45b0-a0df-81a1a77b29b8
create Event Sourcing Anti Patterns and Failures → about → Aggregate Root Anti-Pattern
context (empty) → Fourth anti-pattern — the 'friendly fight' Ladd picks.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → fd357908-6682-403f-9137-5349f516c23d
create Event Sourcing Anti Patterns and Failures → about → Reservation Pattern
context (empty) → Cited as a case where no entity is needed, so framework-forced entities are harmful.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → f4122a36-a471-4735-9d10-214ce1cba685
create Event Sourcing Anti Patterns and Failures → about → Expected Version
context (empty) → Used as the key example of why handlers must control their writers.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 7238ed7d-25a7-4b44-bb37-49843b6b2089
create Event Sourcing Anti Patterns and Failures → about → Contextualized Complexity
context (empty) → Closing argument that added patterns are contextualized complexity, not global complexity.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → c8f5c168-c804-4d98-be23-8a5f8d51ee71
create Event Sourcing Anti Patterns and Failures → about → Aggregate Root
context (empty) → Directly critiques the aggregate-root pattern and its use.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 09c37511-f144-42de-a3e8-abae18862f96
create Event Sourcing Anti Patterns and Failures → about → Event Store
context (empty) → Discusses writing to the event store, its immutability, and centralised-vs-per-service deployment.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 41e612ae-2c1f-4a3c-8690-d47ac47e0174
create Event Sourcing Anti Patterns and Failures → about → Entity Store
context (empty) → Sketched as the Eventide library providing entity projection with cache and snapshotting.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 111a5c90-99c8-44b7-8e32-b25d2b578053
create Event Sourcing Anti Patterns and Failures → about → Active Record
context (empty) → Uses MVC+ORM as the foil against which event sourcing is contrasted.
relation (empty) → about
source_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
target_node_id (empty) → 633eeea8-2026-4906-b512-1e239f3db152
create Entity Store → related_to → Eventide
context (empty) → entity_store is one of the ~30 libraries that make up the Eventide toolkit.
relation (empty) → related_to
source_node_id (empty) → 111a5c90-99c8-44b7-8e32-b25d2b578053
target_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
create Immutable Database Raises Mistake Cost → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Explicit warning motivating avoidance of the anti-patterns.
relation (empty) → from_talk
source_node_id (empty) → 72063b7a-4126-4a2f-8f06-f06ed38f924a
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Keep Entities Free Of Messaging → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Recommendation from the first anti-pattern.
relation (empty) → from_talk
source_node_id (empty) → 2feaa423-a235-428f-9c49-522c9aa8e25d
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Events Record What Occurred, Nothing Else → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Recommendation from the second anti-pattern.
relation (empty) → from_talk
source_node_id (empty) → 68b76301-2620-41f1-9986-d1a4f5ca3553
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Handlers Must Control Their Dependencies → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Recommendation from the third anti-pattern.
relation (empty) → from_talk
source_node_id (empty) → 4db2dafc-effc-4b7f-a2fe-d604256c3130
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Don't Conflate Entity, Handler and Projection → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Recommendation from the fourth anti-pattern.
relation (empty) → from_talk
source_node_id (empty) → 262ec9f9-ecce-45e4-a89e-f911cc32ef8a
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Scrutinize Community Thought Leaders → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Closing meta-advice section of the talk.
relation (empty) → from_talk
source_node_id (empty) → 9422601e-5bef-4592-9d34-f0027fc72672
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create A Week Of Up-Front Design Is Not Waterfall → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Closing 'measure twice, cut once' message.
relation (empty) → from_talk
source_node_id (empty) → ac2a1281-c415-4af1-b676-f479b63c6570
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Tooling Never Forced Your Monolith → from_talk → Event Sourcing Anti Patterns and Failures
context (empty) → Closing warning against blaming Rails or expecting Elixir to fix it.
relation (empty) → from_talk
source_node_id (empty) → c1573c68-a934-4eb9-b4ad-03a7f3f88523
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Keep Entities Free Of Messaging → about → Entity Coupled To Messaging
context (empty) → Directly addresses the first anti-pattern.
relation (empty) → about
source_node_id (empty) → 2feaa423-a235-428f-9c49-522c9aa8e25d
target_node_id (empty) → 464fbf52-5421-4819-b59c-959db0f9d819
create Events Record What Occurred, Nothing Else → about → View-Biased Event Schemas
context (empty) → Directly addresses the second anti-pattern.
relation (empty) → about
source_node_id (empty) → 68b76301-2620-41f1-9986-d1a4f5ca3553
target_node_id (empty) → 1879d94d-1505-48d7-88f5-b6d45eca370a
create Handlers Must Control Their Dependencies → about → Opaque Dependencies
context (empty) → Directly addresses the third anti-pattern.
relation (empty) → about
source_node_id (empty) → 4db2dafc-effc-4b7f-a2fe-d604256c3130
target_node_id (empty) → f7438446-2e23-45b0-a0df-81a1a77b29b8
create Don't Conflate Entity, Handler and Projection → about → Aggregate Root Anti-Pattern
context (empty) → Directly addresses the fourth anti-pattern.
relation (empty) → about
source_node_id (empty) → 262ec9f9-ecce-45e4-a89e-f911cc32ef8a
target_node_id (empty) → fd357908-6682-403f-9137-5349f516c23d
create What is an entity? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → ea4f4111-4363-46b5-86c5-7ca0092364b6
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Is the sufficient-funds check a feature envy smell? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 415b1eca-d359-45ca-aaed-7200ec65bceb
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create What is the biggest challenge with this approach? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 3b6e9374-558e-4321-ab14-4b575b7badf6
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create How is the event-write kept consistent with external operations? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → ec49a735-cc6b-48c8-b95c-344ec8dca4e1
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create How do you order events across distributed systems? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 5fa0d9a9-0f0f-48c1-ae7f-716ed9a83d3a
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Do Rails adopters write handlers instead of controller actions? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 775d9b1d-f988-4f02-842f-4ed0d6b58a93
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create How do you deal with event versioning? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 061e7a74-be24-4db5-a2bb-81c2adb68f7e
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Centralised vs per-service event store? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → c54ca509-5844-48b4-8d53-4652722592bc
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create Do events store current state, and how does replay perform? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → 08d12182-f3bf-4a63-a0ee-29ac52b4c5b0
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create How do you deal with GDPR in an immutable event store? → asked_at → Event Sourcing Anti Patterns and Failures
context (empty) → Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → ca8e147a-3331-498f-953e-1fad3fdf9bd4
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d
create How do you order events across distributed systems? → about → Vector Clock
context (empty) → Ladd names vector clocks as the technical answer.
relation (empty) → about
source_node_id (empty) → 5fa0d9a9-0f0f-48c1-ae7f-716ed9a83d3a
target_node_id (empty) → d2d2adf5-34ca-4adc-9c3d-a54b6cb4851d
create How do you deal with event versioning? → about → Event Sourcing
context (empty) → Versioning strategies specific to event-sourced systems.
relation (empty) → about
source_node_id (empty) → 061e7a74-be24-4db5-a2bb-81c2adb68f7e
target_node_id (empty) → 687c9da2-de87-4fb2-a758-c7498f394fd5
create Do events store current state, and how does replay perform? → about → Entity Caching and Snapshotting
context (empty) → Answer describes version-keyed entity cache and periodic snapshots shipped by entity_store.
relation (empty) → about
source_node_id (empty) → 08d12182-f3bf-4a63-a0ee-29ac52b4c5b0
target_node_id (empty) → 4301ef2d-36cc-4513-b1be-2eaae118ce74
create Do events store current state, and how does replay perform? → about → Entity Store
context (empty) → Answer cites Eventide's entity_store library as providing the cache and snapshotting.
relation (empty) → about
source_node_id (empty) → 08d12182-f3bf-4a63-a0ee-29ac52b4c5b0
target_node_id (empty) → 111a5c90-99c8-44b7-8e32-b25d2b578053
create Centralised vs per-service event store? → about → Event Store
context (empty) → Answer contrasts event-store isolation properties with per-service relational DBs.
relation (empty) → about
source_node_id (empty) → c54ca509-5844-48b4-8d53-4652722592bc
target_node_id (empty) → 41e612ae-2c1f-4a3c-8690-d47ac47e0174
create Do Rails adopters write handlers instead of controller actions? → about → Command Message
context (empty) → Answer recommends having controllers write command messages to streams for portability.
relation (empty) → about
source_node_id (empty) → 775d9b1d-f988-4f02-842f-4ed0d6b58a93
target_node_id (empty) → 02772774-712b-4af2-9ec4-e4eafa94cb07
create Is the sufficient-funds check a feature envy smell? → about → Command Handler
context (empty) → Answer argues the decision belongs in the handler, not the entity.
relation (empty) → about
source_node_id (empty) → 415b1eca-d359-45ca-aaed-7200ec65bceb
target_node_id (empty) → e72326d6-a168-47a5-a1f7-dea8b50d49e3
create What is an entity? → related_to → Entity Projection
context (empty) → Asked to disambiguate 'entity' as used throughout the talk.
relation (empty) → related_to
source_node_id (empty) → ea4f4111-4363-46b5-86c5-7ca0092364b6
target_node_id (empty) → 28ae0d67-fcf9-4a6a-adb3-fb01e56cc520

Read set

97 nodes

concept Event Sourcing search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes talk Event Sourcing and Actor model in Ruby search_nodes person Nathan Ladd search_nodes concept Event Store search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Enables Distribution search_nodes question How to migrate legacy data into an event-sourced system? search_nodes question How to persist commands in an event-sourced system? search_nodes project Eventide search_nodes talk Event Sourcing Anti Patterns and Failures search_nodes+get_node_edges event wroclove.rb 2018 search_nodes+get_node_edges event wroclove.rb 2019 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Spice up your life with eql search_nodes talk Development with axioms search_nodes tool aggregate_root search_nodes concept Polymorphic Aggregate search_nodes concept Aggregate Root search_nodes takeaway Contribute to Arkency aggregates repository search_nodes concept Aggregator search_nodes project aggregates repository search_nodes takeaway Group models into folders by entity dependency search_nodes concept Namespace-Based Folder Hierarchy search_nodes concept Saga Pattern search_nodes concept Projector search_nodes concept CQRS search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes concept Idempotent Projectors and Reactors search_nodes question Can Trailblazer be combined with event sourcing and CQRS? search_nodes question When is a command considered processed? search_nodes concept Commands, Queries, and Events search_nodes concept Events and Commands search_nodes concept Event Handler Error Strategy search_nodes concept Message Store search_nodes concept Command Form search_nodes concept Sometimes Nothing Is Enough search_nodes person Nick Sutterer search_nodes concept Trailblazer Activity search_nodes concept Trailblazer Workflow search_nodes tool Trailblazer search_nodes tool Tyrant search_nodes concept Trailblazer Operation search_nodes tool GraphQL search_nodes tool RealtimeBoard search_nodes person Adam Okoń search_nodes takeaway Time Travel Superpower search_nodes concept Denormalizer / Read Model search_nodes concept Read-Write Split search_nodes talk MVCC for Ruby developers search_nodes concept Embrace The Evented Model search_nodes takeaway Horizontal Scale Superpower search_nodes concept Distributed Monolith search_nodes takeaway Eventual Consistency Trade-off search_nodes takeaway Replay-Based Debugging search_nodes person Scott Bell search_nodes takeaway Recommend Reading The Eventide Project search_nodes tool Faker search_nodes talk Webmock unmocked search_nodes concept Fixtures over Factories search_nodes concept Stubs over Mocks search_nodes tool Cells search_nodes talk Orchestrating video transcoding in ruby search_nodes tool power_assert search_nodes takeaway Prefer fixtures and stubs over factories and mocks search_nodes concept Service Autonomy search_nodes talk Building uls for microservices search_nodes takeaway Bounded Contexts Are Natural Microservice Seams search_nodes takeaway Bounded Contexts Are Not Microservices search_nodes concept Partitioning search_nodes takeaway Don't Bring MVC-CRUD Thinking To Services search_nodes takeaway Break Code Into Small Units Orchestrated By A Process Engine search_nodes takeaway Silver Bullet Anti-Pattern search_nodes takeaway Design Must Be Described Precisely Before It Can Be Improved search_nodes takeaway Avoid complexity before fighting it search_nodes question Does experienced architect's intuition override precise design vocabulary? search_nodes takeaway Design UX Before Technology search_nodes concept Stalling For Time search_nodes concept Architecture Drivers search_nodes takeaway A Week Or Two Of Up-front Analysis Is Still Agile search_nodes takeaway Prefer conventions over custom code search_nodes concept Page Load Time Budget search_nodes question How to do DDD remotely? search_nodes concept Active Record search_nodes concept Domain Model (vs Active Record Model) search_nodes takeaway Split Active Record into write and read objects search_nodes tool acts_as_api search_nodes tool Sequel search_nodes tool Active Storage search_nodes tool Paperclip search_nodes tool Rails 5.2 search_nodes

36 edges