← Extractions

Applying CQRS & Event Sourcing on Rails applications — Andrzej Śliwa at wroclove.rb 2018

Andrzej Śliwa walks through a Rails + rails_event_store implementation of CQRS and event sourcing, covering EventStorming with business experts, bounded contexts, dry-struct command forms, aggregates, sagas, event versioning/upcasting, denormalizers/read models, error-handling strategies, and learning via mind maps. Q&A covers infrastructure maintenance cost, boilerplate/generators, and convincing product managers via EventStorming.

Model
claude-opus-4-7
Ingestion
d7b5c497
Input tokens
104,417
fresh
45,017
cached
59,400
Output tokens
6,171
Duration
83.0s
Roundtrips
4
Tool calls
11
Cost
$0.00
Nodes/edges extracted
44 / 62
Read set (nodes/edges)
69 / 32

Nodes (44)

update Andrzej Śliwa person
description Berlin-based Ruby developer working at a fintech startup and departing to Zencargo. Interested in domain-driven desig... Berlin-based Ruby developer who was working at a fintech startup (securitization of loans) and departing to Zencargo ...
update Applying CQRS & Event Sourcing on Rails applications talk
description Talk at wroclove.rb 2018. Andrzej Śliwa's wroclove.rb 2018 talk presenting a round-trip tour of applying CQRS and event sourcing on Rails. Cove...
short_description Talk at wroclove.rb 2018. Talk at wroclove.rb 2018 on building event-sourced Rails apps with rails_event_store.
update wroclove.rb 2018 event
description Single-track, non-profit Ruby conference. Single-track, non-profit Ruby conference held 2018-03-16 in Wrocław, Poland.
create Zencargo company
kind (empty) company
name (empty) Zencargo
slug (empty) zencargo
attrs (empty) {"industry" => "logistics"}
description (empty) Company that Andrzej Śliwa mentioned joining after his Berlin fintech role.
short_description (empty) Logistics/digital freight forwarding company.
create Arkency company
kind (empty) company
name (empty) Arkency
slug (empty) arkency
attrs (empty) {"industry" => "software consultancy"}
description (empty) Ruby consultancy that maintains rails_event_store and related gems. Granted the speaker direct slack access and commi...
short_description (empty) Ruby consultancy, maintainers of rails_event_store.
create rails_event_store tool
kind (empty) tool
name (empty) rails_event_store
slug (empty) rails_event_store
attrs (empty) {"category" => "library"}
description (empty) Open-source Rails event store maintained by Arkency. Used by the speaker as the platform for event sourcing: good doc...
short_description (empty) Ruby gem providing an event store and event-driven infrastructure for Rails.
create dry-types tool
kind (empty) tool
name (empty) dry-types
slug (empty) dry-types
attrs (empty) {"category" => "library"}
description (empty) Library from the dry-rb family used to describe domain types, value objects, union types and custom constructors (e.g...
short_description (empty) Ruby library for static-like type definitions and constraints.
create dry-struct tool
kind (empty) tool
name (empty) dry-struct
slug (empty) dry-struct
attrs (empty) {"category" => "library"}
description (empty) Used to represent commands and events with strict schemas. Events are strict (all fields required) so missing informa...
short_description (empty) Ruby library for typed struct definitions built on dry-types.
create dry-validation tool
kind (empty) tool
name (empty) dry-validation
slug (empty) dry-validation
attrs (empty) {"category" => "library"}
description (empty) Previously used for validations on commands. The team is slowly moving away from it because it is strongly opinionate...
short_description (empty) Ruby validation library from the dry-rb family.
create ruby-contracts tool
kind (empty) tool
name (empty) ruby-contracts
slug (empty) ruby-contracts
attrs (empty) {"category" => "library"}
description (empty) Used to verify infrastructure code contracts and to implement simple pattern matching (e.g. an event 'new' method sup...
short_description (empty) Ruby contracts library with runtime type checks and pattern matching.
create RealtimeBoard tool
kind (empty) tool
name (empty) RealtimeBoard
slug (empty) realtimeboard
attrs (empty) {"category" => "service"}
description (empty) Online whiteboard (later known as Miro) the team uses for EventStorming sessions, allowing multiple participants to w...
short_description (empty) Collaborative online whiteboard used for remote EventStorming.
create Ruby on Rails tool
kind (empty) tool
name (empty) Ruby on Rails
slug (empty) ruby-on-rails
attrs (empty) {"category" => "framework"}
description (empty) The framework on top of which the event-sourced architecture described in the talk is built.
short_description (empty) Server-side web application framework written in Ruby.
create PostgreSQL tool
kind (empty) tool
name (empty) PostgreSQL
slug (empty) postgresql
attrs (empty) {"category" => "service"}
description (empty) Mentioned as a possible read-model store alongside alternatives like Elasticsearch or Cassandra.
short_description (empty) Open-source relational database.
create Elasticsearch tool
kind (empty) tool
name (empty) Elasticsearch
slug (empty) elasticsearch
attrs (empty) {"category" => "service"}
description (empty) Mentioned as a read-store optimized for search use cases when building denormalized view models.
short_description (empty) Distributed search and analytics engine.
create Cassandra tool
kind (empty) tool
name (empty) Cassandra
slug (empty) cassandra
attrs (empty) {"category" => "service"}
description (empty) Mentioned as an alternative read-store for specific query needs in a CQRS architecture.
short_description (empty) Distributed wide-column NoSQL database.
create RSpec tool
kind (empty) tool
name (empty) RSpec
slug (empty) rspec
attrs (empty) {"category" => "library"}
description (empty) Used by the speaker to describe use cases and verify assumptions while implementing the command form and other infras...
short_description (empty) Ruby behavior-driven testing framework.
create EventStorming concept
description Workshop format invented by Alberto Brandolini in which business experts and developers place colored sticky notes on... Workshop format invented by Alberto Brandolini in which business experts and developers place colored sticky notes on...
create Domain-Driven Design concept
kind (empty) concept
name (empty) Domain-Driven Design
slug (empty) domain-driven-design
attrs (empty) {"category" => "methodology"}
description (empty) Approach originating in Eric Evans' work, further elaborated by multiple books. The speaker emphasizes DDD requires c...
short_description (empty) Approach to modeling software around the business domain using a ubiquitous language.
create Event Sourcing concept
kind (empty) concept
name (empty) Event Sourcing
slug (empty) event-sourcing
attrs (empty) {"category" => "pattern"}
description (empty) Persistence approach where aggregate state is reconstructed by replaying past events from an event store. Enables dec...
short_description (empty) Pattern of persisting state as a sequence of domain events.
create CQRS concept
kind (empty) concept
name (empty) CQRS
slug (empty) cqrs
attrs (empty) {"category" => "architecture"}
description (empty) Architectural pattern separating commands (writes) from queries (reads). In this talk, commands are dispatched throug...
short_description (empty) Command Query Responsibility Segregation: separating write and read models.
create Bounded Context concept
kind (empty) concept
name (empty) Bounded Context
slug (empty) bounded-context
attrs (empty) {"category" => "pattern"}
description (empty) Encapsulation boundary around domain logic ensuring each concept has a unique meaning inside it. E.g., B2B and B2C cu...
short_description (empty) DDD boundary within which a model has a single, unambiguous meaning.
create Aggregate Root concept
kind (empty) concept
name (empty) Aggregate Root
slug (empty) aggregate-root
attrs (empty) {"category" => "pattern"}
description (empty) Main object defining transaction/consistency boundaries and the public contract for a tree of related objects. In eve...
short_description (empty) DDD object serving as the consistency and public-contract entry point of an object tree.
create Saga / Process Manager concept
kind (empty) concept
name (empty) Saga / Process Manager
slug (empty) saga-process-manager
attrs (empty) {"category" => "pattern"}
description (empty) Pattern for coordinating work across aggregates. Sagas model long-running processes (e.g., purchase verification); pr...
short_description (empty) Long-running coordinator of multiple aggregates to achieve a business goal.
create Command Form concept
description Pattern developed on top of rails_event_store: a form object behaving like an ActiveModel form that wraps nested dry-... Pattern developed on top of rails_event_store: a form object behaving like an ActiveModel form that wraps nested dry-...
create Denormalizer / Read Model concept
kind (empty) concept
name (empty) Denormalizer / Read Model
slug (empty) denormalizer-read-model
attrs (empty) {"category" => "pattern"}
description (empty) Event handlers that subscribe to published events and project them into read-optimized storage (ActiveRecord, Elastic...
short_description (empty) Event subscriber that builds query-optimized views from domain events.
create Event Versioning / Upcasting concept
kind (empty) concept
name (empty) Event Versioning / Upcasting
slug (empty) event-versioning-upcasting
attrs (empty) {"category" => "pattern"}
description (empty) Technique to evolve event schemas over time: events carry a version number and callbacks that upcast older versions. ...
short_description (empty) Evolving persisted events by migrating to newer versions on read.
create Nested Aggregates concept
kind (empty) concept
name (empty) Nested Aggregates
slug (empty) nested-aggregates
attrs (empty) {"category" => "pattern"}
description (empty) An experimental approach to splitting growing aggregates by nesting aggregate roots. The speaker is not satisfied wit...
short_description (empty) Aggregate root containing other aggregates to manage complexity.
create Policies and Strategies concept
kind (empty) concept
name (empty) Policies and Strategies
slug (empty) policies-and-strategies
attrs (empty) {"category" => "pattern"}
description (empty) Pattern for moving business constraints out of aggregates into standalone objects (policies/strategies) that can be u...
short_description (empty) Extracted business rules testable without the aggregate.
create Interface Wrapper for Ruby concept
kind (empty) concept
name (empty) Interface Wrapper for Ruby
slug (empty) interface-wrapper-for-ruby
attrs (empty) {"category" => "pattern"}
description (empty) Custom helper the speaker built to simulate interfaces in Ruby: define a module listing methods, mark objects as impl...
short_description (empty) Module-based wrapper exposing only specified methods as a Ruby 'interface'.
create Mind Map Knowledge Base for Event Sourcing concept
kind (empty) concept
name (empty) Mind Map Knowledge Base for Event Sourcing
slug (empty) mind-map-knowledge-base-for-event-sourcing
attrs (empty) {"category" => "practice"}
description (empty) The speaker's approach to learning event sourcing: maintain a mind map linking use cases, patterns, blog posts, books...
short_description (empty) Personal mind map aggregating event-sourcing patterns, use cases, and sources.
create Introducing EventStorming resource
kind (empty) resource
name (empty) Introducing EventStorming
slug (empty) introducing-eventstorming
attrs (empty) {"type" => "book", "author" => "Alberto Brandolini"}
description (empty) Book recommended by the speaker as the primary reference for learning EventStorming, alongside Brandolini's talks on ...
short_description (empty) Book by Alberto Brandolini on the EventStorming workshop technique.
create Domain-Driven Rails resource
kind (empty) resource
name (empty) Domain-Driven Rails
slug (empty) domain-driven-rails
attrs (empty) {"type" => "book"}
description (empty) Book mentioned as a DDD reference that was 'forgotten yesterday'; recommended alongside the canonical DDD literature.
short_description (empty) Arkency book on applying DDD in Rails applications.
create Alberto Brandolini person
kind (empty) person
name (empty) Alberto Brandolini
slug (empty) alberto-brandolini
description (empty) Author of Introducing EventStorming and creator of the EventStorming workshop technique. The speaker recommends watch...
short_description (empty) Creator of EventStorming; DDD practitioner and author.
create Invite business experts into EventStorming sessions takeaway
kind (empty) takeaway
name (empty) Invite business experts into EventStorming sessions
slug (empty) invite-business-experts-into-eventstorming-sessions
attrs (empty) {"type" => "recommendation"}
description (empty) You cannot do DDD without real cooperation from the business side. Use simple tools (sticky notes, colored pens, big ...
short_description (empty) DDD only works when business collaborates directly via simple tools like sticky notes.
create Prefer policies/strategies over nested aggregates takeaway
kind (empty) takeaway
name (empty) Prefer policies/strategies over nested aggregates
slug (empty) prefer-policies-strategies-over-nested-aggregates
attrs (empty) {"type" => "recommendation"}
description (empty) When aggregates grow too big, extracting business constraints into policy/strategy objects that can be tested without...
short_description (empty) Extract growing aggregate logic into testable policies instead of nesting aggregates.
create Put data-input validations on the command form, not the command takeaway
kind (empty) takeaway
name (empty) Put data-input validations on the command form, not the command
slug (empty) put-data-input-validations-on-the-command-form-not-the-command
attrs (empty) {"type" => "recommendation"}
description (empty) Command-form validations are data-input validations tied to the view; they should not be conflated with business-logi...
short_description (empty) Input validations belong to the view layer, not domain commands.
create Avoid fetching external/view state inside event upcasters takeaway
kind (empty) takeaway
name (empty) Avoid fetching external/view state inside event upcasters
slug (empty) avoid-fetching-external-view-state-inside-event-upcasters
attrs (empty) {"type" => "warning"}
description (empty) Upcasters that rely on view models break when those views are refreshed or rebuilt; keep upcasting logic pure with re...
short_description (empty) Event upcasting must not depend on view models that can be rebuilt.
create Standardized building blocks onboard new developers faster takeaway
kind (empty) takeaway
name (empty) Standardized building blocks onboard new developers faster
slug (empty) standardized-building-blocks-onboard-new-developers-faster
attrs (empty) {"type" => "insight"}
description (empty) Having a consistent architecture of commands, command handlers, events, event handlers, and denormalizers let a newly...
short_description (empty) Well-defined command/handler/event patterns simplify onboarding despite boilerplate.
create Use EventStorming to align co-founders and onboard stakeholders takeaway
kind (empty) takeaway
name (empty) Use EventStorming to align co-founders and onboard stakeholders
slug (empty) use-eventstorming-to-align-co-founders-and-onboard-stakeholders
attrs (empty) {"type" => "lesson-learned"}
description (empty) At the speaker's fintech startup, EventStorming revealed that two co-founders had different visions of the business, ...
short_description (empty) EventStorming surfaces disagreements and becomes a living onboarding artifact.
create How much time does maintaining the event-sourcing infrastructure take? question
kind (empty) question
name (empty) How much time does maintaining the event-sourcing infrastructure take?
slug (empty) how-much-time-does-maintaining-the-event-sourcing-infrastructure-take
attrs (empty) {"answer_summary" => "Built incrementally as needed; pair programming plus RSpec-driven use cases kept it tractable (...
description (empty) Audience member asks what percentage of time is spent maintaining the custom infrastructure code and whether it is 'd...
short_description (empty) Audience question about time invested in custom event-sourcing plumbing.
create How do you handle boilerplate of commands/handlers/events — scaffolding generators? question
kind (empty) question
name (empty) How do you handle boilerplate of commands/handlers/events — scaffolding generators?
slug (empty) how-do-you-handle-boilerplate-of-commands-handlers-events-scaffolding-generators
attrs (empty) {"answer_summary" => "No generators; standardization of building blocks keeps code simple and makes onboarding new de...
description (empty) Audience member asks whether the speaker uses Rails-style generators/scaffolding to reduce boilerplate from adding co...
short_description (empty) Audience question about boilerplate growth and code generation.
create How to convince a product manager at a medium-sized startup to invest in event sourcing? question
kind (empty) question
name (empty) How to convince a product manager at a medium-sized startup to invest in event sourcing?
slug (empty) how-to-convince-a-product-manager-at-a-medium-sized-startup-to-invest-in-event-sourcing
attrs (empty) {"answer_summary" => "Show business value through EventStorming: reveals disagreements, aligns stakeholders, doubles ...
description (empty) Audience member asks how to convince product management in a medium-sized startup to allocate resources to event sour...
short_description (empty) Audience question about getting buy-in for event sourcing.
create Event Handler Error Strategy concept
description Configurable strategy layered on rails_event_store so that an error in one denormalizer/handler doesn't stop other su... Configurable strategy layered on rails_event_store so that an error in one denormalizer/handler doesn't stop other su...
create Rails Reload-Safe ES Configuration concept
kind (empty) concept
name (empty) Rails Reload-Safe ES Configuration
slug (empty) rails-reload-safe-es-configuration
attrs (empty) {"category" => "practice"}
description (empty) When using rails_event_store in a Rails app, reload! will re-register event and command handlers, causing multiple su...
short_description (empty) Configuration pattern preventing duplicate event subscriptions across Rails reloads.

Edges (62)

update Andrzej ŚliwaauthoredApplying CQRS & Event Sourcing on Rails applications
context (empty) Speaker and author of the talk.
update Applying CQRS & Event Sourcing on Rails applicationspresented_atwroclove.rb 2018
context (empty) Talk delivered at wroclove.rb 2018.
create Andrzej Śliwaworks_atZencargo
attrs {"role" => "joining"} {"role" => "developer"}
context Speaker mentions being on departure to Zencargo. Mentioned he was departing to Zencargo at the time of the talk.
create Andrzej Śliwahas_skillCQRS
attrs (empty) {"level" => "expert"}
context (empty) Talk subject; speaker architected a CQRS system.
relation (empty) has_skill
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Andrzej Śliwausesrails_event_store
context (empty) Builds the fintech product on rails_event_store and contributes to it.
relation (empty) uses
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Andrzej ŚliwarecommendsDomain-Driven Rails
context (empty) Points to this book as a DDD reference that was overlooked the prior day.
relation (empty) recommends
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) bea568ed-0956-4dbb-b35c-a84a960a2ee1
create Applying CQRS & Event Sourcing on Rails applicationsaboutEvent Sourcing
context (empty) Core subject of the talk.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Applying CQRS & Event Sourcing on Rails applicationsaboutCQRS
context (empty) Core subject of the talk.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Applying CQRS & Event Sourcing on Rails applicationsaboutDomain-Driven Design
context Discusses DDD context alongside event sourcing. Positions CQRS/ES work within DDD.
create Applying CQRS & Event Sourcing on Rails applicationsaboutEventStorming
context (empty) Opens with EventStorming as the cornerstone of collaborative DDD.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create Applying CQRS & Event Sourcing on Rails applicationsaboutBounded Context
context Explains bounded context as the border for unique meaning. Defines bounded context as the border for unique meaning (e.g., B2B vs B2C customers).
create Applying CQRS & Event Sourcing on Rails applicationsaboutAggregate Root
context Large portion discusses aggregate roots in event sourcing. Large portion discusses aggregate roots in event sourcing including command vs event-callback methods.
create Applying CQRS & Event Sourcing on Rails applicationsaboutSaga / Process Manager
context Describes implementing sagas as aggregate-root-like objects. Implements sagas as aggregate-root-like objects with their own events.
create Applying CQRS & Event Sourcing on Rails applicationsaboutCommand Form
context (empty) Details the command form pattern built on dry-struct.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) bf5ae0e9-371d-4f77-962d-142ef2b676aa
create Applying CQRS & Event Sourcing on Rails applicationsaboutEvent Versioning / Upcasting
context Explains versioning events and event class mapping. Explains versioning events, upcasting callbacks, and event-class name mapping.
create Applying CQRS & Event Sourcing on Rails applicationsaboutNested Aggregates
context Discusses and critiques nested aggregate roots. Discusses experimental nested aggregates and why the speaker is dissatisfied.
create Applying CQRS & Event Sourcing on Rails applicationsaboutPolicies and Strategies
context Recommends extracting logic to policies/strategies. Recommends extracting logic into policies/strategies over nesting aggregates.
create Applying CQRS & Event Sourcing on Rails applicationsaboutInterface Wrapper for Ruby
context Presents a custom interface wrapper for Ruby objects. Presents a module-based interface wrapper to scope aggregate public contracts.
create Applying CQRS & Event Sourcing on Rails applicationsaboutEvent Handler Error Strategy
context Describes configurable error-handling strategy for event subscribers. Describes configurable error handling for event subscribers.
create Applying CQRS & Event Sourcing on Rails applicationsaboutMind Map Knowledge Base for Event Sourcing
context (empty) Shares the personal mind map used to learn event sourcing.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) f22ed976-2500-4a42-b442-cd1b7f9c7b95
create Applying CQRS & Event Sourcing on Rails applicationsaboutrails_event_store
context (empty) Entire architecture is built on top of rails_event_store.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Applying CQRS & Event Sourcing on Rails applicationsaboutdry-types
context (empty) Used to define domain types and value objects.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 6669b526-7545-407c-993f-4580e69ae743
create Applying CQRS & Event Sourcing on Rails applicationsaboutdry-struct
context (empty) Used for commands and events with schema/strict modes.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 8afe9d20-c096-418e-80db-a3002004df0f
create Applying CQRS & Event Sourcing on Rails applicationsaboutdry-validation
context (empty) Previously used for validations; team is moving away from it.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) d0742e31-8ece-450c-8f38-801e65d09036
create Applying CQRS & Event Sourcing on Rails applicationsaboutruby-contracts
context (empty) Used for contracts and pattern matching in infrastructure code.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) d0d491a7-6128-459a-936d-2c2cb60c7915
create rails_event_storerelated_toArkency
context (empty) rails_event_store is maintained by Arkency and other contributors.
relation (empty) related_to
source_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
target_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
create rails_event_storerelated_toRuby on Rails
context (empty) rails_event_store targets Ruby on Rails applications.
relation (empty) related_to
source_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create dry-structrelated_todry-types
context (empty) dry-struct is built on dry-types.
relation (empty) related_to
source_node_id (empty) 8afe9d20-c096-418e-80db-a3002004df0f
target_node_id (empty) 6669b526-7545-407c-993f-4580e69ae743
create Alberto BrandoliniauthoredIntroducing EventStorming
context Brandolini wrote the EventStorming book. Author of the book.
create Alberto Brandolinirelated_toEventStorming
context (empty) Creator of the EventStorming technique.
relation (empty) related_to
source_node_id (empty) bdbfabf7-feeb-4cfe-a40d-191dca70e0ec
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create Invite business experts into EventStorming sessionsfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) Takeaway drawn from the talk's opening section on EventStorming.
relation (empty) from_talk
source_node_id (empty) 33e6b8ba-faba-4fbb-b897-5ece5bcc792c
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Invite business experts into EventStorming sessionsaboutEventStorming
context (empty) Advice is about running EventStorming effectively.
relation (empty) about
source_node_id (empty) 33e6b8ba-faba-4fbb-b897-5ece5bcc792c
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create Applying CQRS & Event Sourcing on Rails applicationsaboutDenormalizer / Read Model
context Covers event handlers and read models for CQRS. Covers event handlers/denormalizers projecting into read models and queries.
create Prefer policies/strategies over nested aggregatesfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) Speaker recommends this after discussing nested aggregates.
relation (empty) from_talk
source_node_id (empty) 1354bfc2-5bb9-4d16-90fb-3dd5b855828d
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Prefer policies/strategies over nested aggregatesaboutPolicies and Strategies
context (empty) Concerns extraction of logic into policies and strategies.
relation (empty) about
source_node_id (empty) 1354bfc2-5bb9-4d16-90fb-3dd5b855828d
target_node_id (empty) 17f0be90-7a48-43ea-a440-1ca29502c36e
create Prefer policies/strategies over nested aggregatesaboutNested Aggregates
context (empty) Advises against using nested aggregates as the primary solution.
relation (empty) about
source_node_id (empty) 1354bfc2-5bb9-4d16-90fb-3dd5b855828d
target_node_id (empty) 5840ddf2-8562-442e-8976-92f4cafec762
create Put data-input validations on the command form, not the commandfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) Design decision shared during the command-form section.
relation (empty) from_talk
source_node_id (empty) f3675817-720c-4a63-842b-38543d656516
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Put data-input validations on the command form, not the commandaboutCommand Form
context (empty) Clarifies where validation logic belongs in the command-form pattern.
relation (empty) about
source_node_id (empty) f3675817-720c-4a63-842b-38543d656516
target_node_id (empty) bf5ae0e9-371d-4f77-962d-142ef2b676aa
create Avoid fetching external/view state inside event upcastersfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) Warning raised in the event versioning section.
relation (empty) from_talk
source_node_id (empty) 13e0500a-6e3c-479f-9f03-05e9bcb78020
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Avoid fetching external/view state inside event upcastersaboutEvent Versioning / Upcasting
context (empty) Rule about implementing event upcasters safely.
relation (empty) about
source_node_id (empty) 13e0500a-6e3c-479f-9f03-05e9bcb78020
target_node_id (empty) 3f7e2d06-2544-46d2-878e-dcfb69b15f41
create Standardized building blocks onboard new developers fasterfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) Drawn from Q&A about boilerplate and onboarding.
relation (empty) from_talk
source_node_id (empty) efd6e617-834c-4a1e-817e-462895bf0918
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Use EventStorming to align co-founders and onboard stakeholdersfrom_talkApplying CQRS & Event Sourcing on Rails applications
context (empty) From Q&A answer about convincing product managers.
relation (empty) from_talk
source_node_id (empty) 537693cc-78cc-4053-a5aa-61b116ce5d13
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create Use EventStorming to align co-founders and onboard stakeholdersaboutEventStorming
context (empty) Story illustrates benefits of EventStorming with stakeholders.
relation (empty) about
source_node_id (empty) 537693cc-78cc-4053-a5aa-61b116ce5d13
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create How much time does maintaining the event-sourcing infrastructure take?asked_atApplying CQRS & Event Sourcing on Rails applications
context (empty) Asked during Q&A of this talk.
relation (empty) asked_at
source_node_id (empty) 5dd088ff-61cd-4da2-8858-dfff940cd201
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create How much time does maintaining the event-sourcing infrastructure take?aboutrails_event_store
context (empty) Concerns maintenance of the custom plumbing around rails_event_store.
relation (empty) about
source_node_id (empty) 5dd088ff-61cd-4da2-8858-dfff940cd201
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create How do you handle boilerplate of commands/handlers/events — scaffolding generators?asked_atApplying CQRS & Event Sourcing on Rails applications
context (empty) Asked during Q&A of this talk.
relation (empty) asked_at
source_node_id (empty) 7da30487-4b1f-4480-ac62-3f36f568190f
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create How do you handle boilerplate of commands/handlers/events — scaffolding generators?aboutCQRS
context (empty) Question concerns boilerplate in a CQRS architecture.
relation (empty) about
source_node_id (empty) 7da30487-4b1f-4480-ac62-3f36f568190f
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create How to convince a product manager at a medium-sized startup to invest in event sourcing?asked_atApplying CQRS & Event Sourcing on Rails applications
context (empty) Asked during Q&A of this talk.
relation (empty) asked_at
source_node_id (empty) a711f6bf-6948-40c3-90f8-bf73fdd986e1
target_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
create How to convince a product manager at a medium-sized startup to invest in event sourcing?aboutEvent Sourcing
context (empty) Concerns organizational adoption of event sourcing.
relation (empty) about
source_node_id (empty) a711f6bf-6948-40c3-90f8-bf73fdd986e1
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Applying CQRS & Event Sourcing on Rails applicationsaboutRails Reload-Safe ES Configuration
context (empty) Covers configuration needed so Rails reload! doesn't duplicate subscriptions.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) b88373ed-d321-49d7-8e3c-e86382e4704b
create Applying CQRS & Event Sourcing on Rails applicationsaboutRealtimeBoard
context Mentioned as the tool used for remote EventStorming sessions. Mentioned as the whiteboard used for remote EventStorming.
create Applying CQRS & Event Sourcing on Rails applicationsaboutIntroducing EventStorming
context (empty) Recommends Brandolini's book for learning EventStorming.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) 3eba1d1d-8917-4a38-91c1-77dad0f41209
create Applying CQRS & Event Sourcing on Rails applicationsaboutDomain-Driven Rails
context (empty) Mentioned as a DDD reference book to read.
relation (empty) about
source_node_id (empty) 333f91ee-229a-4c05-b476-01c7488e8d80
target_node_id (empty) bea568ed-0956-4dbb-b35c-a84a960a2ee1
create Andrzej Śliwaworks_onrails_event_store
context Contributes pull requests to the gem with direct commit access from Arkency. Contributing to rails_event_store via Arkency; some of the team's patterns merged upstream.
create Andrzej Śliwarelated_toArkency
context (empty) Granted slack access and commit rights as a rails_event_store contributor.
relation (empty) related_to
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
create Andrzej Śliwahas_skillEvent Sourcing
context Speaker has been practicing and teaching event sourcing. Speaker demonstrates production experience applying event sourcing in Rails.
create Andrzej Śliwahas_skillDomain-Driven Design
context Speaker states interest and experience in DDD over many years. Speaker applies DDD with business stakeholders at his fintech.
create Andrzej ŚliwarecommendsIntroducing EventStorming
context Recommends Brandolini's book for learning EventStorming. Tells audience to read Brandolini's book for EventStorming.
create Andrzej ŚliwarecommendsEventStorming
context Calls EventStorming the most important part of doing DDD in a company. Promotes EventStorming as the most important part of doing DDD.
create Andrzej Śliwarecommendsrails_event_store
context (empty) Explains choice of platform: good docs, active maintenance, welcoming contributor process.
relation (empty) recommends
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Andrzej ŚliwausesRealtimeBoard
context (empty) Team uses RealtimeBoard for remote EventStorming sessions.
relation (empty) uses
source_node_id (empty) 85da3fcc-bd29-47c7-a138-fa1708770fc9
target_node_id (empty) 7f1b2c99-31ff-4bbd-ae18-b1b682f173ce
create Alberto Brandoliniworks_onEventStorming
attrs (empty) {"role" => "creator"}
context (empty) Creator of the EventStorming technique.
relation (empty) works_on
source_node_id (empty) bdbfabf7-feeb-4cfe-a40d-191dca70e0ec
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1

Read set

69 nodes

talk Applying CQRS & Event Sourcing on Rails applications search_nodes+get_node_edges talk Event Sourcing and Actor model in Ruby search_nodes talk Event Sourcing Anti Patterns and Failures search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes talk MVCC for Ruby developers search_nodes person Ismael Celis search_nodes talk Business logic in Ruby search_nodes talk Typical DDDomains In Rails Apps search_nodes talk The good, the bad and the remote — collaborative domain modeling with EventStorming search_nodes talk UringMachine — High Performance Concurrency for Ruby Using io_uring search_nodes talk Orchestrating video transcoding in ruby search_nodes talk Events events events search_nodes talk The pillars of Domain Driven Design search_nodes talk Might & Magic of Domain-Driven Design search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes talk Introducing Sorbet into your Ruby codebase search_nodes talk Building on Bluesky's AT Protocol with Ruby search_nodes talk Building LLM powered applications in Ruby search_nodes person Adam Okoń search_nodes talk An Introduction to Test Bench search_nodes talk Multi-region data governance in Rails application search_nodes event wroclove.rb 2018 search_nodes 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 2026 search_nodes event wroclove.rb 2025 search_nodes talk Counterintuitive Rails pt. 2 search_nodes talk Counterintuitive Rails pt. 1 search_nodes talk Adventures in durable execution search_nodes talk Building uls for microservices search_nodes person Julik Tarkhanov search_nodes person Emiliano Della Casa search_nodes talk Nightmare neighbours caveats of Rails based mutlitenancy search_nodes person Andrzej Śliwa search_nodes talk Ruby Rendezvous Method Call, Proc, and Beyond search_nodes talk Grokking FP For The Practicing Rubyist search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes talk From PostgreSQL to SQLite in Rails search_nodes talk Securing Rails applications search_nodes talk Fantastic Databases and Where to Find Them search_nodes tool rails_event_store search_nodes concept Event Sourcing search_nodes concept Mind Map Knowledge Base for Event Sourcing search_nodes company Arkency search_nodes concept Domain-Driven Design search_nodes concept EventStorming search_nodes resource Domain-Driven Rails search_nodes concept CQRS search_nodes person Łukasz Szydło search_nodes person Adam Piotrowski search_nodes person Mariusz Gil search_nodes talk No 'Pundit' Intended search_nodes person Agnieszka Małaszkiewicz search_nodes person Mateusz Nowak search_nodes person Andrzej Krzywda search_nodes talk One machine please, make it Turing search_nodes tool dry-struct search_nodes tool dry-types search_nodes tool dry-validation search_nodes tool ruby-contracts search_nodes person Alberto Brandolini search_nodes tool RealtimeBoard search_nodes company Zencargo search_nodes resource Introducing EventStorming search_nodes

32 edges