← Extractions

Working with RailsEventStore in a Cashflow Management System

Łukasz Reszke's wroclove.rb 2023 talk sharing six real-world stories from applying rails_event_store, event-driven architecture and tactical DDD gradually to Trezy, a cash-flow management app. Key lessons: persist webhooks as technical events, use aggregates as the source of truth, encapsulate business rules, and adopt event sourcing step by step without needing greenfield or micro-services.

Model
claude-opus-4-7
Ingestion
45a13664
Input tokens
642,636
fresh
457,896
cached
173,434
cache write
11,306
Output tokens
14,288
Duration
230.6s
Roundtrips
12
Tool calls
30
Cost
$0.00
Nodes/edges extracted
15 / 49
Read set (nodes/edges)
196 / 2

Nodes (15)

create Ordering Events Blog Post by Rafał resource
kind (empty) resource
name (empty) Ordering Events Blog Post by Rafał
slug (empty) ordering-events-blog-post-by-rafal
attrs (empty) {"type" => "blog-post"}
description (empty) Blog post by 'Rapha' (likely Rafał Łasocha of Arkency) recommended by the speaker as the go-to reference when running...
short_description (empty) Arkency blog post by Rafał on handling no-order-guarantee in event-driven systems.
update Łukasz Reszke person
attrs (empty) {"employer" => "Arkency", "former_stack" => ".NET", "current_stack" => "Ruby / Rails"}
description Conference speaker. Ruby developer at Arkency who spoke at wroclove.rb 2023 about applying rails_event_store, event sourcing and event-dr...
short_description Conference speaker. Arkency Ruby developer; speaker on rails_event_store in production.
update Working with RailsEventStore in Cashflow Management System talk
description Talk at wroclove.rb 2023. Łukasz Reszke's wroclove.rb 2023 talk walking through six stories from Trezy, a cash-flow management SaaS: (1) proces...
short_description Talk at wroclove.rb 2023. wroclove.rb 2023 talk: six stories of applying rails_event_store gradually in a legacy Rails startup.
create Trezy project
kind (empty) project
name (empty) Trezy
slug (empty) trezy
attrs (empty) {"stack" => "Rails + rails_event_store + Sidekiq + PostgreSQL", "status" => "active"}
description (empty) Cash-flow management application for small businesses. Lets users see all their bank-account balances in one place, a...
short_description (empty) Cash-flow management SaaS for small businesses, built on Rails.
create Open Banking Provider concept
kind (empty) concept
name (empty) Open Banking Provider
slug (empty) open-banking-provider
attrs (empty) {"category" => "architecture"}
description (empty) Third-party integrators that sit between banks and financial applications, sending account balances, transactions and...
short_description (empty) Third-party service delivering bank-account data to financial apps, typically via webhooks.
create Webhook-as-Technical-Event Pattern concept
kind (empty) concept
name (empty) Webhook-as-Technical-Event Pattern
slug (empty) webhook-as-technical-event-pattern
attrs (empty) {"category" => "pattern"}
description (empty) Pattern presented in the talk for handling third-party webhooks: instead of synchronously processing the payload all ...
short_description (empty) Store incoming webhooks as events in the event store before processing them asynchronously.
create acts_as_paranoid tool
kind (empty) tool
name (empty) acts_as_paranoid
slug (empty) acts_as_paranoid
attrs (empty) {"category" => "library"}
description (empty) Ruby gem implementing soft deletion on Active Record models (records are marked deleted rather than removed). Used in...
short_description (empty) Rails gem implementing soft deletion via a deleted_at column.
create Event-Driven CRUD Hybrid concept
kind (empty) concept
name (empty) Event-Driven CRUD Hybrid
slug (empty) event-driven-crud-hybrid
attrs (empty) {"category" => "architecture"}
description (empty) Pragmatic hybrid style coined by the Trezy team (half-jokingly 'all rights reserved'): start from a CRUD Rails codeba...
short_description (empty) Pragmatic style mixing CRUD with selected event-sourced aggregates and read models.
create Migration Event Pattern concept
kind (empty) concept
name (empty) Migration Event Pattern
slug (empty) migration-event-pattern
attrs (empty) {"category" => "practice"}
description (empty) Pattern the Trezy team uses when introducing a new aggregate or read model into an existing code base: backfill the d...
short_description (empty) Seed new event streams with a dedicated 'migration' event to backfill state.
create Stream as Source of Truth concept
kind (empty) concept
name (empty) Stream as Source of Truth
slug (empty) stream-as-source-of-truth
attrs (empty) {"category" => "practice"}
description (empty) Design decision the Trezy team made for selected parts of the system: when an aggregate exists (e.g. BankAccount, Tra...
short_description (empty) Design rule that an aggregate's event stream is the authoritative state, not the DB table.
create Store webhooks as technical events takeaway
kind (empty) takeaway
name (empty) Store webhooks as technical events
slug (empty) store-webhooks-as-technical-events
attrs (empty) {"type" => "recommendation"}
description (empty) Instead of processing webhooks synchronously all the way to the database, persist the payload as a technical event in...
short_description (empty) Persist third-party webhook payloads as events, then process async.
create All writes must go through the aggregate takeaway
kind (empty) takeaway
name (empty) All writes must go through the aggregate
slug (empty) all-writes-must-go-through-the-aggregate
attrs (empty) {"type" => "lesson-learned"}
description (empty) Once an aggregate is introduced as the source of truth for some logic, every feature that modifies that part of the s...
short_description (empty) If an aggregate owns an invariant, every write path must use it or the stream lies.
create Replay events to reproduce bugs takeaway
kind (empty) takeaway
name (empty) Replay events to reproduce bugs
slug (empty) replay-events-to-reproduce-bugs
attrs (empty) {"type" => "recommendation"}
description (empty) Because payloads and domain events are persisted immutably, bugs can be reproduced by replaying the exact event that ...
short_description (empty) Event sourcing turns bug reproduction into replaying the stored event.
create Adopt event sourcing gradually takeaway
kind (empty) takeaway
name (empty) Adopt event sourcing gradually
slug (empty) adopt-event-sourcing-gradually
attrs (empty) {"type" => "recommendation"}
description (empty) Event sourcing doesn't require a greenfield project, micro-services, kubernetes or a second database. The Trezy team ...
short_description (empty) Start from CRUD and introduce events/aggregates where they add value.
create Don't be afraid of event sourcing takeaway
kind (empty) takeaway
name (empty) Don't be afraid of event sourcing
slug (empty) don-t-be-afraid-of-event-sourcing
attrs (empty) {"type" => "insight"}
description (empty) The speaker's closing message: event sourcing turned out to be the easiest of the patterns he explored (DDD, CQRS, ev...
short_description (empty) Event sourcing is 'just a persistence pattern' — easier than DDD, CQRS or EDA.

Edges (49)

update Łukasz ReszkeauthoredWorking with RailsEventStore in Cashflow Management System
context (empty) Delivered this talk as his first time speaking at wroclove.rb.
update Working with RailsEventStore in Cashflow Management Systempresented_atwroclove.rb 2023
context (empty) Opening talk of wroclove.rb 2023.
create Łukasz Reszkeworks_atArkency
attrs (empty) {"role" => "Ruby developer"}
context (empty) Says he works at Arkency, rescuing legacy Rails projects on a daily basis.
relation (empty) works_at
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) f8b4b616-ffd6-4eaa-a7b9-fdc07bb2cb27
create Łukasz Reszkeworks_onTrezy
context (empty) Builds the cash-flow management system described in the six stories.
relation (empty) works_on
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
create Łukasz Reszkeusesrails_event_store
context (empty) Uses rails_event_store as the event store library in Trezy.
relation (empty) uses
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Łukasz Reszkehas_skillRuby
attrs (empty) {"level" => "intermediate"}
context (empty) Converted from .NET to Ruby two years before the talk and now works on a Rails app.
relation (empty) has_skill
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) c7f25b33-06c9-460e-aca7-fe993123ebee
create Łukasz Reszkehas_skill.NET
attrs (empty) {"level" => "intermediate"}
context (empty) Former .NET developer; helped into Ruby by Andrzej.
relation (empty) has_skill
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 6adabc22-a7e5-4b0d-942a-21d5d22737e1
create Łukasz ReszkerecommendsOrdering Events Blog Post by Rafał
context (empty) Recommends this blog post to anyone hitting no-order-guarantee issues in event-driven systems.
relation (empty) recommends
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) d5866fed-e1d7-4a45-a6cb-bcbfdd0be54a
create Łukasz ReszkerecommendsAdopt event sourcing gradually
context (empty) Closing message encouraging incremental adoption.
relation (empty) recommends
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 719f694d-e285-43a4-b62b-4b6524c8e636
create Łukasz ReszkerecommendsDon't be afraid of event sourcing
context (empty) Closing message of the talk.
relation (empty) recommends
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 1224ac7d-8b6f-45e3-8148-5ddbfc317dac
create Working with RailsEventStore in Cashflow Management SystemaboutTrezy
context (empty) All six stories come from Trezy.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
create Working with RailsEventStore in Cashflow Management Systemaboutrails_event_store
context (empty) Explains rails_event_store usage in production.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create Working with RailsEventStore in Cashflow Management SystemaboutEvent Sourcing
context (empty) Event sourcing is the core persistence pattern discussed.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Working with RailsEventStore in Cashflow Management SystemaboutEvent-Driven Architecture
context (empty) Async processing of webhooks and classification via event handlers.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) efb4cdd4-e26e-438e-8251-79aac4161d04
create Working with RailsEventStore in Cashflow Management SystemaboutDomain-Driven Design
context (empty) Uses tactical DDD patterns (aggregates, read models, processes).
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Working with RailsEventStore in Cashflow Management SystemaboutAggregate Root
context (empty) Introduces bank-account and transaction-classification aggregates.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 09c37511-f144-42de-a3e8-abae18862f96
create Working with RailsEventStore in Cashflow Management SystemaboutProcess Manager
context (empty) Three explicit classification processes are modeled as event-sourced processes.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 1b1d68aa-23bc-4410-8af3-f095676d9722
create Working with RailsEventStore in Cashflow Management SystemaboutRead Model
context (empty) Shows splitting read model from write model in the classification project.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create Working with RailsEventStore in Cashflow Management SystemaboutCQRS
context (empty) Classification project implements 'almost full CQRS' minus a second DB.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Working with RailsEventStore in Cashflow Management SystemaboutWebhook-as-Technical-Event Pattern
context (empty) First story presents this pattern for open-banking webhooks.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 4c598452-3dbf-48fe-963f-923e3eec3b79
create Working with RailsEventStore in Cashflow Management SystemaboutEvent-Driven CRUD Hybrid
context (empty) Closes with the team's self-coined hybrid style.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) ca33d3d4-2bef-44a9-9ac1-dc7a86b50e7f
create Working with RailsEventStore in Cashflow Management SystemaboutMigration Event Pattern
context (empty) Describes backfilling new aggregates/read models via dedicated migration events.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 0d185f0d-3eed-459a-92a5-54472fa33ed7
create Working with RailsEventStore in Cashflow Management SystemaboutStream as Source of Truth
context (empty) Design decision underpinning the aggregate stories.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) f6e07aad-09eb-494d-b98f-e000d7dfb365
create Working with RailsEventStore in Cashflow Management SystemaboutOpen Banking Provider
context (empty) First and third stories concern integrations with open-banking providers.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 7885cdbe-3a97-4f36-9a28-a3bfdfa2f6ab
create Working with RailsEventStore in Cashflow Management Systemaboutacts_as_paranoid
context (empty) Soft deletion via acts_as_paranoid caused bugs that events helped debug.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) 302ebf4e-1f9b-4a41-b0f4-ed14d3bb718f
create Working with RailsEventStore in Cashflow Management SystemaboutEventStorming
context (empty) Speaker uses EventStorming notation for aggregate rules.
relation (empty) about
source_node_id (empty) 54901958-e188-4502-b354-d2657accf511
target_node_id (empty) f531d860-d7e6-449c-8289-ffa29995f7d1
create Trezyusesrails_event_store
context (empty) Primary event-store library in the monolith.
relation (empty) uses
source_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8
create TrezyusesSidekiq
context (empty) Runs async event handlers as Sidekiq jobs.
relation (empty) uses
source_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
target_node_id (empty) 2365c22d-c83e-4553-b865-ec22d0b5b225
create TrezyusesPostgreSQL
context (empty) Single Postgres database backs both the read model and rails_event_store.
relation (empty) uses
source_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
target_node_id (empty) 46fc2697-69fc-436b-ac82-250ba4370273
create Trezyusesacts_as_paranoid
context (empty) Legacy soft-delete gem still present in the codebase.
relation (empty) uses
source_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
target_node_id (empty) 302ebf4e-1f9b-4a41-b0f4-ed14d3bb718f
create Trezyusesaggregate_root
context (empty) Bank-account and transaction-classification aggregates include the AggregateRoot module.
relation (empty) uses
source_node_id (empty) f74d806a-1ceb-422d-b964-009f24dc8eef
target_node_id (empty) 570146e3-03be-459c-8ceb-e88dad04ef52
create Store webhooks as technical eventsfrom_talkWorking with RailsEventStore in Cashflow Management System
context (empty) First-story takeaway.
relation (empty) from_talk
source_node_id (empty) 54b4ab69-8633-464f-9ea8-8d304921a3b9
target_node_id (empty) 54901958-e188-4502-b354-d2657accf511
create Store webhooks as technical eventsaboutWebhook-as-Technical-Event Pattern
context (empty) Recommendation expresses this pattern.
relation (empty) about
source_node_id (empty) 54b4ab69-8633-464f-9ea8-8d304921a3b9
target_node_id (empty) 4c598452-3dbf-48fe-963f-923e3eec3b79
create All writes must go through the aggregatefrom_talkWorking with RailsEventStore in Cashflow Management System
context (empty) Lesson from the 'closed bank account with missing events' story.
relation (empty) from_talk
source_node_id (empty) ae6d8f8b-f21c-4852-bec9-9269081ad03c
target_node_id (empty) 54901958-e188-4502-b354-d2657accf511
create All writes must go through the aggregateaboutAggregate Root
context (empty) Reinforces aggregate as the single write path.
relation (empty) about
source_node_id (empty) ae6d8f8b-f21c-4852-bec9-9269081ad03c
target_node_id (empty) 09c37511-f144-42de-a3e8-abae18862f96
create Replay events to reproduce bugsfrom_talkWorking with RailsEventStore in Cashflow Management System
context (empty) Used twice to debug and fix customer data.
relation (empty) from_talk
source_node_id (empty) 08883587-2dfa-4070-a392-f1ccedfc2e76
target_node_id (empty) 54901958-e188-4502-b354-d2657accf511
create Replay events to reproduce bugsaboutEvent Sourcing
context (empty) Benefit specific to event-sourced systems.
relation (empty) about
source_node_id (empty) 08883587-2dfa-4070-a392-f1ccedfc2e76
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Adopt event sourcing graduallyfrom_talkWorking with RailsEventStore in Cashflow Management System
context (empty) Concluding recommendation of the talk.
relation (empty) from_talk
source_node_id (empty) 719f694d-e285-43a4-b62b-4b6524c8e636
target_node_id (empty) 54901958-e188-4502-b354-d2657accf511
create Adopt event sourcing graduallyaboutEvent Sourcing
context (empty) Recommends gradual adoption.
relation (empty) about
source_node_id (empty) 719f694d-e285-43a4-b62b-4b6524c8e636
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Don't be afraid of event sourcingfrom_talkWorking with RailsEventStore in Cashflow Management System
context (empty) Final slide message.
relation (empty) from_talk
source_node_id (empty) 1224ac7d-8b6f-45e3-8148-5ddbfc317dac
target_node_id (empty) 54901958-e188-4502-b354-d2657accf511
create Don't be afraid of event sourcingaboutEvent Sourcing
context (empty) Addresses perceived complexity of event sourcing.
relation (empty) about
source_node_id (empty) 1224ac7d-8b6f-45e3-8148-5ddbfc317dac
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Webhook-as-Technical-Event Patternrelated_toEvent-Driven Architecture
context (empty) Built on top of async processing via events.
relation (empty) related_to
source_node_id (empty) 4c598452-3dbf-48fe-963f-923e3eec3b79
target_node_id (empty) efb4cdd4-e26e-438e-8251-79aac4161d04
create Event-Driven CRUD Hybridrelated_toCQRS
context (empty) Partial adoption of CQRS without a second database.
relation (empty) related_to
source_node_id (empty) ca33d3d4-2bef-44a9-9ac1-dc7a86b50e7f
target_node_id (empty) 8918002a-9def-4449-a187-e3052bf175b5
create Event-Driven CRUD Hybridrelated_toEvent Sourcing
context (empty) Uses event sourcing selectively where the business prioritizes it.
relation (empty) related_to
source_node_id (empty) ca33d3d4-2bef-44a9-9ac1-dc7a86b50e7f
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Migration Event Patternrelated_toEvent Sourcing
context (empty) Specific migration approach for event-sourced systems.
relation (empty) related_to
source_node_id (empty) 0d185f0d-3eed-459a-92a5-54472fa33ed7
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Stream as Source of Truthrelated_toAggregate Root
context (empty) Stream belongs to the aggregate that protects invariants.
relation (empty) related_to
source_node_id (empty) f6e07aad-09eb-494d-b98f-e000d7dfb365
target_node_id (empty) 09c37511-f144-42de-a3e8-abae18862f96
create Ordering Events Blog Post by RafałaboutEvent-Driven Architecture
context (empty) Addresses how to deal with no order guarantee in event-driven systems.
relation (empty) about
source_node_id (empty) d5866fed-e1d7-4a45-a6cb-bcbfdd0be54a
target_node_id (empty) efb4cdd4-e26e-438e-8251-79aac4161d04
create Łukasz Reszkehas_skillEvent Sourcing
attrs (empty) {"level" => "intermediate"}
context (empty) Uses event sourcing daily in production on Trezy.
relation (empty) has_skill
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 687c9da2-de87-4fb2-a758-c7498f394fd5
create Łukasz Reszkehas_skillrails_event_store
attrs (empty) {"level" => "intermediate"}
context (empty) Works with rails_event_store daily in Trezy.
relation (empty) has_skill
source_node_id (empty) 24a51b96-a038-4d2c-b19a-c5581183e8eb
target_node_id (empty) 9e5cb718-6f86-4937-9b4c-eb77da3aede8

Read set

196 nodes

tool rails_event_store search_nodes tool Rails Event Store Event Browser search_nodes concept Event Sourcing search_nodes tool Ruby Event Store search_nodes concept Event Store search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes talk Event Sourcing and Actor model in Ruby search_nodes project rails_event_store/ecommerce search_nodes takeaway rails_event_store is the most productive DDD tool in Ruby search_nodes tool Heckle search_nodes tool New Relic search_nodes tool Datadog search_nodes tool AppSignal search_nodes tool Grafana search_nodes tool Codecov search_nodes tool Prometheus search_nodes concept Logux Proxy search_nodes concept Database Indexes search_nodes tool PgBouncer search_nodes tool Citus search_nodes concept EXPLAIN / EXPLAIN ANALYZE search_nodes tool PgHero search_nodes talk Fantastic Databases and Where to Find Them search_nodes resource Postgres for Everything search_nodes talk From PostgreSQL to SQLite in Rails search_nodes concept EventStorming search_nodes company Arkency search_nodes tool Ruby search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Ruby Archaeology search_nodes project Ruby Romania search_nodes tool aggregate_root search_nodes tool Standard RB search_nodes talk Scientific Ruby Lightning Talk search_nodes tool TruffleRuby search_nodes tool Ruby Packer search_nodes person Łukasz Reszke search_nodes+get_node_edges person Adam Okoń search_nodes person Łukasz Szydło search_nodes takeaway Name Things To Find Their Properties search_nodes talk How to Be Top 10% in Ruby Lightning Talk search_nodes tool ChatGPT search_nodes tool left-pad search_nodes concept xkcd Dependency / Nebraska Problem search_nodes tool knapsack_pro search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes talk Building LLM powered applications in Ruby search_nodes talk International cooperation in IT teams search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes+get_node_edges takeaway Trailblazer tracing saves thousands of debugging hours search_nodes concept Trailblazer Workflow search_nodes company Transloadit search_nodes concept Data Tokenization search_nodes takeaway Time Travel Superpower search_nodes tool RealtimeBoard search_nodes resource tea White Paper search_nodes person Andrzej Krzywda search_nodes person Andrzej Śliwa search_nodes concept Event-Driven Architecture search_nodes question Immediate benefit of event-driven architecture? search_nodes concept Architecture Drivers search_nodes takeaway Event Sourcing Is Not A Silver Bullet search_nodes concept Onion Architecture search_nodes project Eventide search_nodes concept Hexagonal Architecture search_nodes takeaway Event Sourcing Is A Side Effect Of Pub/Sub search_nodes concept Single-Tenant Architecture search_nodes concept Embrace The Evented Model search_nodes concept destroy_all vs delete_all search_nodes question Is the WHERE-clause leak risk real with acts_as_tenant? search_nodes tool acts_as_tenant search_nodes concept Active Record search_nodes concept Default scope for region preview search_nodes tool activerecord-multi-tenant search_nodes takeaway Avoid Active Record callbacks for media processing search_nodes concept ActiveRecord Encryption search_nodes takeaway Three Ways To Delete User Data In Event-Sourced Systems search_nodes question How does GDPR deletion work if encrypted events are in backups? search_nodes tool Sidekiq search_nodes concept Sidekiq Batches search_nodes question Scaling Sidekiq Elastically search_nodes takeaway Prefer Small Sidekiq Jobs search_nodes concept Sidekiq Middleware search_nodes takeaway Keep Sidekiq Job Parameters Simple search_nodes talk Under The Hood And On The Surface Of Sidekiq search_nodes question Sidekiq And Redis Cluster search_nodes question Application-Level Back Pressure For Sidekiq search_nodes talk Sidekiq Batches Lightning Talk search_nodes concept Command Query Separation search_nodes concept CQRS search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes concept Commands, Queries, and Events search_nodes takeaway Handlers Must Control Their Dependencies search_nodes concept Entity Coupled To Messaging search_nodes concept Domain as Function from Commands to Events search_nodes takeaway DDD Is More Than Aggregates search_nodes concept Process Manager search_nodes concept Saga / Process Manager search_nodes concept Saga Pattern search_nodes question When is a command considered processed? search_nodes project raise_permanent_job search_nodes question Deduplicating Jobs For The Same Record search_nodes concept Trailblazer Activity search_nodes takeaway Prefer a simple top-to-bottom worker search_nodes resource Implementing Domain-Driven Design search_nodes concept Domain-Driven Design search_nodes concept Aggregate Root Anti-Pattern search_nodes talk Might & Magic of Domain-Driven Design search_nodes takeaway Aggregates Should Not Emit Events search_nodes talk The pillars of Domain Driven Design search_nodes takeaway Contribute to Arkency aggregates repository search_nodes resource Domain-Driven Rails search_nodes concept On-Upload Processing search_nodes tool image_processing gem search_nodes concept On-the-fly Processing search_nodes concept Sometimes Nothing Is Enough search_nodes takeaway Don't reinvent multi-tenancy — use existing gems search_nodes concept Mutation Testing Preconditions search_nodes concept Mutation Testing search_nodes concept Incremental Mutation Testing search_nodes takeaway Start mutation testing incrementally search_nodes takeaway Mutation testing replaces dumb review questions search_nodes concept Selection (Mutant) search_nodes talk Setup and operation of mutation testing in agentic world search_nodes question Should every project use mutation testing? search_nodes tool webpagetest.org search_nodes concept GitHub Self-Hosted Runner search_nodes tool jq search_nodes tool TSort search_nodes project Petri Nets Performance Prediction Gem search_nodes concept tus protocol search_nodes tool acts_as_api search_nodes concept Read Model search_nodes concept Read-Write Split search_nodes takeaway Split Reads From Writes With Projections search_nodes takeaway Read models must not depend on each other search_nodes concept Projection Function search_nodes concept Projector search_nodes question How often should projections be rebuilt? search_nodes concept Entity Projection search_nodes question Meaning of the projection sequence number search_nodes question Projection freshness and snapshots search_nodes concept Logux Time-Shift Ordering search_nodes talk Events events events search_nodes concept Cache Preheating search_nodes question How do you order events across distributed systems? search_nodes tool GraphQL search_nodes talk Write a Blog Lightning Talk search_nodes takeaway Signed On-the-fly URLs search_nodes resource Ironin blog search_nodes question How to migrate legacy data into an event-sourced system? search_nodes takeaway Automate Phantom Migration Rollback search_nodes takeaway Gradual migration via steps search_nodes question How do you deal with event versioning? search_nodes talk Phantom Migrations Gem Lightning Talk search_nodes concept Data Evolution search_nodes question How to handle very large event volumes over time? search_nodes question How do you search across millions of events for top items? search_nodes question Do events store current state, and how does replay perform? search_nodes concept Aggregate Root search_nodes concept Polymorphic Aggregate search_nodes takeaway Elevate Validations Into The Domain search_nodes takeaway Push constraints down to the lowest level search_nodes takeaway Don't Conflate Entity, Handler and Projection search_nodes concept Remote EventStorming Split-Merge Structure search_nodes question How is the event-write kept consistent with external operations? search_nodes takeaway Don't Cram Eventide Into Legacy Apps search_nodes question Asynchronous EventStorming Experience search_nodes question Convincing Developers to Participate in EventStorming search_nodes question Including Unavailable Domain Experts search_nodes tool .NET search_nodes tool IronRuby search_nodes tool TypeScript search_nodes resource awesome-ddd search_nodes tool Electron search_nodes tool GitHub Actions search_nodes takeaway Buy Faster Hardware search_nodes person Michał Bronikowski search_nodes tool PostgreSQL search_nodes concept MVCC Trade-offs in Postgres vs MySQL search_nodes question Projections affecting many streams at once search_nodes concept At-Least-Once Plus Idempotence Recipe search_nodes concept Delivery Semantics search_nodes concept Aggregate-Scoped Sequence Number search_nodes concept Vector Clock search_nodes takeaway Use at-least-once plus idempotence to build self-healing systems search_nodes project Ruby News search_nodes resource Short Ruby Newsletter search_nodes project BBC Sport App search_nodes

2 edges