← Extractions

Introduction To Event Sourcing: How To Use It With Ruby

Pavel (Paweł Strzałkowski) from Visuality introduces event sourcing at wroclove.rb 2022 using the Eventide toolkit. He walks through core concepts — events vs commands, streams, consumers, handlers, projections, pub/sub — and demos MessageDB on Postgres with an account/deposit/withdraw example and a two-account funds-transfer process.

Model
claude-opus-4-7
Ingestion
8559cee4
Input tokens
739,755
fresh
574,595
cached
152,733
cache write
12,427
Output tokens
14,933
Duration
247.7s
Roundtrips
10
Tool calls
30
Cost
$0.00
Nodes/edges extracted
20 / 46
Read set (nodes/edges)
260 / 5

Nodes (20)

update Introduction To Event Sourcing How To Use It With Ruby talk
attrs {"type" => "talk"} → {"date" => "2022-03-11", "type" => "talk"}
description Talk at wroclove.rb 2022. → Paweł ('Pavel') Strzałkowski's wroclove.rb 2022 talk introducing event sourcing in Ruby via the Eventide project. Ope...
short_description Talk at wroclove.rb 2022. → Pavel's wroclove.rb 2022 introduction to event sourcing in Ruby using the Eventide toolkit.
update Paweł Strzałkowski person
attrs (empty) → {"role" => "software developer / consultant", "nationality" => "Polish"}
description Ruby developer building production AI apps with MCP and OAuth. → Software developer and consultant at Visuality (a software house in Warsaw / 'Orso'). Interested in domain-driven des...
short_description Ruby developer, AI and MCP. → Polish Ruby developer and consultant at Visuality; event sourcing and DDD enthusiast.
create Visuality company
kind (empty) → company
name (empty) → Visuality
slug (empty) → visuality
attrs (empty) → {"industry" => "software consultancy", "location" => "Warsaw, Poland"}
description (empty) → Software house based in Warsaw ('Orso' in the transcript), where Paweł Strzałkowski works as a software developer / c...
short_description (empty) → Polish software house in Warsaw employing Ruby consultants.
create MessageDB tool
kind (empty) → tool
name (empty) → MessageDB
slug (empty) → messagedb
attrs (empty) → {"category" => "service"}
description (empty) → Event/message store used by the Eventide project. Implemented as a single table on top of PostgreSQL, shipped as a Ru...
short_description (empty) → Postgres-backed single-table message store for event sourcing, distributed as a Ruby gem.
create TestBench tool
kind (empty) → tool
name (empty) → TestBench
slug (empty) → testbench
attrs (empty) → {"category" => "library"}
description (empty) → Test framework shipped with the Eventide project. Usable in any Ruby project, including Rails. Pavel jokes that to us...
short_description (empty) → Eventide's opinionated test framework for Ruby, used in place of RSpec.
create Consumer concept
kind (empty) → concept
name (empty) → Consumer
slug (empty) → consumer
attrs (empty) → {"category" => "pattern"}
description (empty) → In Eventide, a consumer is a long-running process (analogous to a Sidekiq worker) that continually reads messages fro...
short_description (empty) → Process that continuously reads messages from a category, dispatches them to handlers, and writes new messages.
create Command Stream concept
kind (empty) → concept
name (empty) → Command Stream
slug (empty) → command-stream
attrs (empty) → {"category" => "pattern"}
description (empty) → A stream whose messages are the commands requested from a specific entity (e.g. 'command-order-7' contains AddLineIte...
short_description (empty) → Stream containing all commands addressed to a particular entity instance.
update Event Stream concept
description Partitioning strategy in event sourcing where events related to a single aggregate (e.g. one order, one ice-cream bus... → The most important kind of stream in event sourcing: it contains every event that has happened for an entity (e.g. 'o...
short_description Per-aggregate partition of an event log enabling scoped replay. → Stream containing all events produced for a particular entity instance.
create Append-Only Log concept
kind (empty) → concept
name (empty) → Append-Only Log
slug (empty) → append-only-log
attrs (empty) → {"category" => "architecture"}
description (empty) → Storage pattern underlying event sourcing: events are appended at the end of a log in the order they really happened ...
short_description (empty) → Storage model where records are only appended in order, never modified or deleted.
create Pub/Sub Messaging concept
kind (empty) → concept
name (empty) → Pub/Sub Messaging
slug (empty) → pub-sub-messaging
attrs (empty) → {"category" => "pattern"}
description (empty) → Messaging pattern where publishers write messages to a category (e.g. a stream) without knowing who will consume them...
short_description (empty) → Messaging pattern where publishers and subscribers interact only through named categories.
create Don't Lose Data Unintentionally takeaway
kind (empty) → takeaway
name (empty) → Don't Lose Data Unintentionally
slug (empty) → don-t-lose-data-unintentionally
attrs (empty) → {"type" => "warning"}
description (empty) → Core message of Pavel's talk: if a system can reach a given state through two different paths and you can't tell whic...
short_description (empty) → Store every business-relevant change; you can't put a future price on data you never captured.
create Split Reads From Writes With Projections takeaway
kind (empty) → takeaway
name (empty) → Split Reads From Writes With Projections
slug (empty) → split-reads-from-writes-with-projections
attrs (empty) → {"type" => "recommendation"}
description (empty) → Write to the system via commands that produce events in the event store (source of truth), and read from projections ...
short_description (empty) → Project event streams into any read-optimized database to separate writes from reads.
create UI Data Is Never Truly Fresh takeaway
kind (empty) → takeaway
name (empty) → UI Data Is Never Truly Fresh
slug (empty) → ui-data-is-never-truly-fresh
attrs (empty) → {"type" => "insight"}
description (empty) → When stakeholders insist read models must be instantaneously consistent, remind them that displayed data is already s...
short_description (empty) → Business should accept a few seconds of projection lag; fresh data is already stale on display.
create Meaning of the projection sequence number question
kind (empty) → question
name (empty) → Meaning of the projection sequence number
slug (empty) → meaning-of-the-projection-sequence-number
attrs (empty) → {"answer_summary" => "It's the event's position within its stream — a version number enabling time travel and step-by...
description (empty) → Audience asks what the 'sequence' line in the projection sample code means. Answer: it's the event's position within ...
short_description (empty) → Why does the projection code reference an event's position in the stream?
create Projections affecting many streams at once question
kind (empty) → question
name (empty) → Projections affecting many streams at once
slug (empty) → projections-affecting-many-streams-at-once
attrs (empty) → {"answer_summary" => "By default a projection operates on one stream. Cross-stream projections are modelable but non-...
description (empty) → Audience: if a user change affects all their orders' projections, how is that executed — in parallel, sequentially? A...
short_description (empty) → How are projections handled when one action affects multiple order streams?
create GDPR and losing data intentionally question
kind (empty) → question
name (empty) → GDPR and losing data intentionally
slug (empty) → gdpr-and-losing-data-intentionally
attrs (empty) → {"answer_summary" => "Keep GDPR-sensitive data in a separate stream that can be dropped, or encrypt and lose the key ...
description (empty) → Audience asks how to reconcile immutable events with GDPR 'right to be forgotten'. Answer: design the system so GDPR-...
short_description (empty) → How to comply with GDPR when events are immutable?
create Data consciously dropped vs unintentionally lost question
kind (empty) → question
name (empty) → Data consciously dropped vs unintentionally lost
slug (empty) → data-consciously-dropped-vs-unintentionally-lost
attrs (empty) → {"answer_summary" => "Agreed in principle, but without discipline teams lose data unintentionally. Event sourcing is ...
description (empty) → Audience pushes back that in practice teams consciously decide what to store (for debugging/revenue/legality). Pavel ...
short_description (empty) → Isn't it normal to consciously decide what to store and what to drop?
create NoSQL vs Postgres for an event store question
kind (empty) → question
name (empty) → NoSQL vs Postgres for an event store
slug (empty) → nosql-vs-postgres-for-an-event-store
attrs (empty) → {"answer_summary" => "Deferred. Event versioning is a broad topic worth a separate conversation."}
description (empty) → Audience asks whether a schemaless store (MongoDB, DynamoDB) would be better than Postgres for an event store, given ...
short_description (empty) → Would MongoDB or DynamoDB be better than Postgres for storing versioned events?
create How often should projections be rebuilt? question
kind (empty) → question
name (empty) → How often should projections be rebuilt?
slug (empty) → how-often-should-projections-be-rebuilt
attrs (empty) → {"answer_summary" => "It's a business decision. Default to near-instant projections; a few seconds of lag is usually ...
description (empty) → Audience asks whether every event must end with a projection, and how fresh read models need to be. Answer: it's a bu...
short_description (empty) → Does every event have to trigger a projection, and how fresh must read models be?
create Projection freshness and snapshots question
kind (empty) → question
name (empty) → Projection freshness and snapshots
slug (empty) → projection-freshness-and-snapshots
attrs (empty) → {"answer_summary" => "Keep streams short; make decisions against freshly-projected write-side state seeded from snaps...
description (empty) → Follow-up: how do we know a projection is fresh, and isn't it expensive to reproject from the beginning every time? A...
short_description (empty) → How do you avoid reprojecting from the beginning on every decision?

Edges (46)

update Paweł Strzałkowski → authored → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Pavel delivered this talk at wroclove.rb 2022.
update Introduction To Event Sourcing How To Use It With Ruby → presented_at → wroclove.rb 2022
context (empty) → Talk given at wroclove.rb 2022.
create Paweł Strzałkowski → works_at → Visuality
attrs (empty) → {"role" => "software developer / consultant"}
context (empty) → Pavel introduces himself as a software developer / consultant at Visuality.
relation (empty) → works_at
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 8954f74e-db48-4fe7-a7ad-0438aea232b9
create Paweł Strzałkowski → attended → wroclove.rb 2022
context (empty) → Speaker at the 2022 edition.
relation (empty) → attended
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → cfc5cfd3-25a6-46c2-8b5d-626986c71c24
create Paweł Strzałkowski → has_skill → Event Sourcing
attrs (empty) → {"level" => "expert"}
context (empty) → Pavel states he is extremely interested in event sourcing and uses it professionally.
relation (empty) → has_skill
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 687c9da2-de87-4fb2-a758-c7498f394fd5
create Paweł Strzałkowski → has_skill → Domain-Driven Design
attrs (empty) → {"level" => "intermediate"}
context (empty) → Pavel lists DDD as one of his daily interests.
relation (empty) → has_skill
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 6e2f88bd-e521-41a3-91d4-aeb5f8fd2486
create Paweł Strzałkowski → has_skill → EventStorming
context (empty) → Pavel cites EventStorming among his interests.
relation (empty) → has_skill
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → f531d860-d7e6-449c-8289-ffa29995f7d1
create Paweł Strzałkowski → recommends → Eventide
context (empty) → Pavel recommends the Eventide toolkit and Slack community as the way to start with event sourcing in Ruby.
relation (empty) → recommends
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
create Paweł Strzałkowski → recommends → Scott Bell
context (empty) → Recommends a Scott Bell presentation on writing autonomous services as one of two 'watch this if you take one thing a...
relation (empty) → recommends
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 1a9bf14a-9bd6-4ad1-b80f-5484b342dd14
create Paweł Strzałkowski → recommends → Greg Young
context (empty) → Recommends Greg Young's foundational event sourcing presentations; 'the presentation that got me started'.
relation (empty) → recommends
source_node_id (empty) → c327ddf1-b134-4b34-a43f-44843ab5769d
target_node_id (empty) → 45e8eebf-faf5-48d2-a2fe-fb21ff38b80a
update Introduction To Event Sourcing How To Use It With Ruby → about → Event Sourcing
context Referenced by Krzywda as Pavel's preceding wroclove.rb 2022 talk where read models were introduced. → Central topic: event sourcing as a pattern for storing data in an append-only log.
create Introduction To Event Sourcing How To Use It With Ruby → about → Eventide
context (empty) → All concepts are introduced in the context of the Eventide Ruby toolkit.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
create Introduction To Event Sourcing How To Use It With Ruby → about → MessageDB
context (empty) → Demos MessageDB install, CLI, interactive test writer and viewer.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Introduction To Event Sourcing How To Use It With Ruby → about → TestBench
context (empty) → Mentions TestBench as Eventide's test framework.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 6582919f-afe1-4cd1-9f91-82abad210290
create Introduction To Event Sourcing How To Use It With Ruby → about → Append-Only Log
context (empty) → Defines event sourcing as a pattern for storing data in an append-only log.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 55af4712-bf8e-4fbe-82b2-654f0954a14f
create Introduction To Event Sourcing How To Use It With Ruby → about → Entity Projection
context (empty) → Shows projection code folding events into an Account entity from empty state.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 28ae0d67-fcf9-4a6a-adb3-fb01e56cc520
create Introduction To Event Sourcing How To Use It With Ruby → about → Read Model
context (empty) → Explains projecting event streams into read models (relational, graph, document).
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → d0fcf0df-1ca2-47f0-b431-8dbac005b44d
create Introduction To Event Sourcing How To Use It With Ruby → about → Pub/Sub Messaging
context (empty) → Describes Eventide's pub/sub via consumers reading from categories.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → b483686a-1e8d-4ccf-bcd3-318d16fb27b3
create Introduction To Event Sourcing How To Use It With Ruby → about → Consumer
context (empty) → Introduces consumers as long-running processes reading, processing and writing messages.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 86e5c9ef-011c-4506-a10a-8b39b9b9c6b8
create Introduction To Event Sourcing How To Use It With Ruby → about → Command Handler
context (empty) → Handlers dispatch messages by type and publish resulting events.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → e72326d6-a168-47a5-a1f7-dea8b50d49e3
create Introduction To Event Sourcing How To Use It With Ruby → about → Events and Commands
context (empty) → Distinguishes events (something that happened) from commands (request to do something).
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 772380ce-dd09-4d23-bda6-1acfbec76487
create Introduction To Event Sourcing How To Use It With Ruby → about → Command Stream
context (empty) → Shows command-order-7 as the command stream for an order entity.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 0263614c-5688-46bb-bac0-cb64e3761f30
create Introduction To Event Sourcing How To Use It With Ruby → about → Event Stream
context (empty) → Introduces the event stream as the source of truth for an entity's state.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 8c314bcf-2bbd-4b0d-b2aa-5cdc649e632d
create Introduction To Event Sourcing How To Use It With Ruby → about → Snapshotting
context (empty) → Notes snapshots (Eventide default ~100 events) so projections don't replay from the beginning.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 0c37afd4-ec51-45d4-976d-ed8c6e0a7321
create Introduction To Event Sourcing How To Use It With Ruby → about → Entity Store
context (empty) → Shows Eventide's Entity Store binding an entity class with its projection.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 111a5c90-99c8-44b7-8e32-b25d2b578053
create Introduction To Event Sourcing How To Use It With Ruby → about → Saga Pattern
context (empty) → The funds-transfer example is effectively a process manager / saga across two account streams.
relation (empty) → about
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → b9cda322-dd18-40b0-84d9-b7e002665b86
create Eventide → uses → MessageDB
context (empty) → MessageDB is the Postgres-backed message store shipped as part of Eventide.
relation (empty) → uses
source_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) → 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Eventide → uses → PostgreSQL
context (empty) → MessageDB is implemented on top of Postgres.
relation (empty) → uses
source_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) → 46fc2697-69fc-436b-ac82-250ba4370273
create Eventide → uses → TestBench
context (empty) → TestBench is Eventide's own test framework.
relation (empty) → uses
source_node_id (empty) → 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) → 6582919f-afe1-4cd1-9f91-82abad210290
create Nathan Ladd → works_on → MessageDB
attrs (empty) → {"role" => "co-maintainer"}
context (empty) → Co-principal of the Eventide project, which ships MessageDB.
relation (empty) → works_on
source_node_id (empty) → c2047c7c-2316-4c38-af4f-1e8a78f80206
target_node_id (empty) → 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Scott Bell → works_on → MessageDB
attrs (empty) → {"role" => "co-maintainer"}
context (empty) → Co-maintainer of Eventide's Postgres-backed message store.
relation (empty) → works_on
source_node_id (empty) → 1a9bf14a-9bd6-4ad1-b80f-5484b342dd14
target_node_id (empty) → 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Meaning of the projection sequence number → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 2a2a95fd-b027-48ad-bb52-1c83e424020d
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Projections affecting many streams at once → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → f9559cb4-58d8-4eef-b7bc-39f6dea60080
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create GDPR and losing data intentionally → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 60dc595a-19da-47e3-93a4-7946fc299681
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Data consciously dropped vs unintentionally lost → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 4e09703c-0434-4037-b879-c3811c5a3e42
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create NoSQL vs Postgres for an event store → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 96aeaf59-fbda-42b7-b110-e68bf1ca3097
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create How often should projections be rebuilt? → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 857c54dd-a6fa-4e09-9f49-bf0763d913e6
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Projection freshness and snapshots → asked_at → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Follow-up during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 6aee9d6d-a578-47e3-8278-ce9bc5987dd9
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Don't Lose Data Unintentionally → from_talk → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Core maxim Pavel reiterates: you cannot price data you didn't know you should have stored.
relation (empty) → from_talk
source_node_id (empty) → ef1d9307-2353-4fac-b61d-bc1a0538250f
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create Split Reads From Writes With Projections → from_talk → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Takeaway from Pavel's account/read-model slide.
relation (empty) → from_talk
source_node_id (empty) → 35ccd221-1989-4491-adfa-aeeabb37f046
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create UI Data Is Never Truly Fresh → from_talk → Introduction To Event Sourcing How To Use It With Ruby
context (empty) → Pavel's answer to the 'how often should we project' Q&A.
relation (empty) → from_talk
source_node_id (empty) → d84625d8-420c-432d-b397-337737a89c70
target_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
create GDPR and losing data intentionally → about → Event Sourcing
context (empty) → Asks how immutable event stores reconcile with GDPR right to be forgotten.
relation (empty) → about
source_node_id (empty) → 60dc595a-19da-47e3-93a4-7946fc299681
target_node_id (empty) → 687c9da2-de87-4fb2-a758-c7498f394fd5
create NoSQL vs Postgres for an event store → about → MessageDB
context (empty) → Compares Postgres-backed MessageDB to NoSQL alternatives for event storage.
relation (empty) → about
source_node_id (empty) → 96aeaf59-fbda-42b7-b110-e68bf1ca3097
target_node_id (empty) → 78f59d89-9ba4-40bd-b4b4-1f898046e3fd
create Projection freshness and snapshots → about → Snapshotting
context (empty) → Asks about Eventide's built-in snapshotting mechanism.
relation (empty) → about
source_node_id (empty) → 6aee9d6d-a578-47e3-8278-ce9bc5987dd9
target_node_id (empty) → 0c37afd4-ec51-45d4-976d-ed8c6e0a7321
create Introduction To Event Sourcing How To Use It With Ruby → related_to → Events events events
context (empty) → Both are introductions to event sourcing in Ruby delivered at wroclove.rb; Pavel's is framed inside Eventide while Da...
relation (empty) → related_to
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 43a82c04-35a9-48fe-b93a-b3ab57e5c0be
create Introduction To Event Sourcing How To Use It With Ruby → related_to → Event Sourcing Anti Patterns and Failures
context (empty) → Pavel's talk is the 'introduction' companion to Nathan Ladd's anti-patterns talk in the Eventide ecosystem.
relation (empty) → related_to
source_node_id (empty) → cbb0c15f-f29f-47b4-b307-d9d591951fb7
target_node_id (empty) → 1a847342-76f9-432b-a5f5-82154448650d

Read set

260 nodes

concept Event Sourcing search_nodes takeaway Event Sourcing Is Not A Silver Bullet search_nodes takeaway Hiring For Event Sourcing Trade-off search_nodes takeaway Event Sourcing Is About State Not Distribution search_nodes takeaway Event Sourcing Enables Distribution search_nodes concept Snapshotting search_nodes takeaway Event Sourcing Mind Shift Trade-off search_nodes question Can you do DDD without event sourcing? search_nodes question How to persist commands in an event-sourced system? search_nodes question What is an entity? search_nodes tool image_processing gem search_nodes talk Scientific Ruby Lightning Talk search_nodes+list_nodes_by_kind tool TruffleRuby search_nodes tool Representable search_nodes tool Rails 5.2 search_nodes project Ruby Romania search_nodes project imageflow search_nodes tool mini_magick search_nodes talk Orchestrating video transcoding in ruby search_nodes+list_nodes_by_kind tool streamio-ffmpeg search_nodes project Eventide search_nodes talk Events events events search_nodes+list_nodes_by_kind concept Event Store search_nodes concept Event Bus search_nodes takeaway Name Things To Find Their Properties search_nodes concept Undo Event search_nodes tool RealtimeBoard search_nodes concept Command UUID Deduplication search_nodes tool Entity Store search_nodes tool Sonic Pi search_nodes concept Domain-Driven Design search_nodes resource Implementing Domain-Driven Design search_nodes resource Domain-Driven Design: Patterns, Principles and Practices search_nodes resource Domain-Driven Design: Tackling Complexity in the Heart of Software search_nodes talk Might & Magic of Domain-Driven Design search_nodes+list_nodes_by_kind talk The pillars of Domain Driven Design search_nodes+list_nodes_by_kind resource Domain-Driven Rails search_nodes concept DDD Whirlpool search_nodes concept Domain Storytelling search_nodes question Risk of misidentifying domains during legacy re-architecture search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes+list_nodes_by_kind talk Building LLM powered applications in Ruby search_nodes+list_nodes_by_kind talk Data Management With Ruby search_nodes+get_node_edges+list_nodes_by_kind question Where do you read from without event sourcing? search_nodes person Greg Young search_nodes question What is the biggest challenge with this approach? search_nodes person Nathan Ladd search_nodes concept Read Model search_nodes concept CQRS search_nodes concept Projection Function search_nodes takeaway Don't Conflate Entity, Handler and Projection search_nodes concept Entity Projection search_nodes takeaway Use CQRS And Event Sourcing Independently search_nodes concept Projector search_nodes question Do events store current state, and how does replay perform? search_nodes takeaway Handlers Must Control Their Dependencies search_nodes tool PostgreSQL search_nodes concept Message Store search_nodes tool PgBouncer search_nodes tool DBM / SDBM / GDBM search_nodes tool SQLite search_nodes tool Sequel search_nodes concept Logux Proxy search_nodes takeaway Time Travel Superpower search_nodes talk From PostgreSQL to SQLite in Rails search_nodes+list_nodes_by_kind concept Saga Pattern search_nodes concept Entity Coupled To Messaging search_nodes concept At-Least-Once Plus Idempotence Recipe search_nodes tool Redis search_nodes talk Message Bus Decoupling Lightning Talk search_nodes+list_nodes_by_kind concept Delivery Semantics search_nodes takeaway Use at-least-once plus idempotence to build self-healing systems search_nodes question Deduplicating Jobs For The Same Record search_nodes concept Service Autonomy search_nodes person Scott Bell search_nodes concept GitHub Self-Hosted Runner search_nodes resource Rocket Real-Time Benchmark search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes+list_nodes_by_kind company SpaceX search_nodes concept State Machine search_nodes concept Breadth-First Search for Code Removal search_nodes takeaway Buy Faster Hardware search_nodes tool GitHub Actions search_nodes tool libvips search_nodes tool Preact search_nodes tool WebP search_nodes takeaway Add Fun to Keep Remote Workshops Human search_nodes concept Timeline Visualization search_nodes tool Ruby search_nodes tool ROM search_nodes talk Multi-region data governance in Rails application search_nodes+list_nodes_by_kind takeaway Upgrade Ruby version for free speed search_nodes talk Business logic in Ruby search_nodes+list_nodes_by_kind tool Distributed Ruby search_nodes talk An Introduction to Test Bench search_nodes+list_nodes_by_kind tool test-prof search_nodes tool parallel_tests search_nodes tool Standard RB search_nodes tool Crystal Ball search_nodes tool FactoryBot search_nodes tool power_assert search_nodes question Has Mutant been run against popular Ruby libraries? search_nodes tool minitest search_nodes tool Sync Space VR search_nodes company Transloadit search_nodes tool Tailwind CSS search_nodes tool FFmpeg search_nodes concept EventStorming search_nodes resource Introducing EventStorming search_nodes concept Remote EventStorming Split-Merge Structure search_nodes question Asynchronous EventStorming Experience search_nodes takeaway Stickies Translate Directly To Code search_nodes question Convincing Developers to Participate in EventStorming search_nodes person Adam Okoń search_nodes tool jq search_nodes tool Rust search_nodes talk Event Sourcing and Actor model in Ruby search_nodes+list_nodes_by_kind talk Introduction To Event Sourcing How To Use It With Ruby search_nodes+list_nodes_by_kind+get_node_edges talk Event Sourcing Anti Patterns and Failures search_nodes+list_nodes_by_kind talk Applying CQRS & Event Sourcing on Rails applications search_nodes+list_nodes_by_kind tool Ruby Event Store search_nodes resource Rails Architect Master Class search_nodes talk 10 Things You Never Wanted To Know About Reform 3 list_nodes_by_kind talk 18 months of using hotwire and viewcomponent in production list_nodes_by_kind talk Accidentally building a neural network — A Ruby product recommendation journey list_nodes_by_kind talk Adventures in durable execution list_nodes_by_kind talk Better WebPerformance with Rails list_nodes_by_kind talk Beyond the current state Time travel to the rescue! list_nodes_by_kind talk Building a Production-Ready AI App: MCP & OAuth on Rails list_nodes_by_kind talk Building Beautiful UIs with Ruby A Rails-Native Approach list_nodes_by_kind talk Building on Bluesky's AT Protocol with Ruby list_nodes_by_kind talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web list_nodes_by_kind talk Building uls for microservices list_nodes_by_kind talk Cables! Cables! Cables! list_nodes_by_kind talk Component Driven UI with ViewComponent list_nodes_by_kind+search_nodes talk Configuration Again Lightning Talk list_nodes_by_kind talk Counterintuitive Rails pt. 1 list_nodes_by_kind talk Counterintuitive Rails pt. 2 list_nodes_by_kind talk Dealing With A Project's Complexity In A Changing Environment list_nodes_by_kind talk Debug like a scientist list_nodes_by_kind talk Developer, Programmer, and AI list_nodes_by_kind+search_nodes talk Development with axioms list_nodes_by_kind talk Devise pitfalls and way to tighten security list_nodes_by_kind talk Doctrine of Useful Objects Separate Fact from Fiction in OOD list_nodes_by_kind talk Enterprise Rails Panel list_nodes_by_kind talk Ethereum Smart Contracts Lightning Talk list_nodes_by_kind talk Ever shorter feedback loop list_nodes_by_kind+search_nodes talk Extracting logic from templates with Hanami Views list_nodes_by_kind talk FaaS for Ruby Lightning Talk list_nodes_by_kind talk Fantastic Databases and Where to Find Them list_nodes_by_kind talk Fix Production Bugs 20x Faster list_nodes_by_kind talk From open source to IPO list_nodes_by_kind talk Functional Programming as Naming Lightning Talk list_nodes_by_kind talk Gaming With Ruby and VMs Lightning Talk list_nodes_by_kind talk Gregorian Calendar list_nodes_by_kind talk Grokking FP For The Practicing Rubyist list_nodes_by_kind talk Handling file uploads for modern developer list_nodes_by_kind talk How (and why) to run SQLite in production list_nodes_by_kind talk How I brought LCP down to under 350 ms list_nodes_by_kind talk How To Ensure Systems Do What We Want And Take Care Of Themselves list_nodes_by_kind talk How to hijack list_nodes_by_kind talk How To Package A Rails Engine Generation To Automation list_nodes_by_kind talk How wroclove.rb impacts developers and companies list_nodes_by_kind talk International cooperation in IT teams list_nodes_by_kind talk Introducing Sorbet into your Ruby codebase list_nodes_by_kind talk Is the monolith a problem list_nodes_by_kind talk It is not so bad, after all list_nodes_by_kind talk JavaScript and Frontend Panel list_nodes_by_kind talk JRuby: Professional-Grade Ruby list_nodes_by_kind talk Kamal is not harder than your PaaS list_nodes_by_kind talk LATERAL Joins Rails Performance Lightning Talk list_nodes_by_kind talk Lightning Talk on Email Leaks and Senior Developer Titles list_nodes_by_kind+search_nodes talk Methods Gem for Ruby Method References list_nodes_by_kind talk Mutant on steroids list_nodes_by_kind talk MVCC for Ruby developers list_nodes_by_kind talk My core skill never was the typing list_nodes_by_kind talk Native apps are dead, long live native apps list_nodes_by_kind talk Next Token! list_nodes_by_kind talk Nightmare neighbours caveats of Rails based mutlitenancy list_nodes_by_kind talk No-build Utopia: Modern User Experiences with Rails & Web Standards list_nodes_by_kind talk No 'Pundit' Intended list_nodes_by_kind talk Offline Sandwich Focus Workflow list_nodes_by_kind talk One machine please, make it Turing list_nodes_by_kind talk On the tasteful journey to Yippee list_nodes_by_kind talk Optimistic ul list_nodes_by_kind talk Optimizing performance in Rails apps with GraphQL layer list_nodes_by_kind talk Outdated Browser Detection list_nodes_by_kind talk Performance of Distributed Applications list_nodes_by_kind+search_nodes talk Prevent account sharing list_nodes_by_kind talk Reforging (or rather rebrewing) the support for open-source list_nodes_by_kind talk Removing Code with Breadth-First Search list_nodes_by_kind talk Rewrite with confidence list_nodes_by_kind talk Rubyana Gems and the Ractorous Rubetta Stones! list_nodes_by_kind talk Ruby has literally always had types list_nodes_by_kind talk Ruby on a $4 Computer list_nodes_by_kind talk Ruby Rendezvous Method Call, Proc, and Beyond list_nodes_by_kind talk Ruby Standard Library Hidden Gems Lightning Talk list_nodes_by_kind talk Securing Rails applications list_nodes_by_kind talk Setup and operation of mutation testing in agentic world list_nodes_by_kind talk Sidekiq Batches Lightning Talk list_nodes_by_kind+search_nodes talk Sonic Pi Music Performance list_nodes_by_kind talk Spice up your life with eql list_nodes_by_kind talk SUPER AIN'T SUPER From OOP To FP and Beyond! list_nodes_by_kind talk Testing Randomness list_nodes_by_kind talk The Curse of Service Object list_nodes_by_kind talk The good, the bad and the remote — collaborative domain modeling with EventStorming list_nodes_by_kind talk Toolbelt of a Seasoned Bug Hunter list_nodes_by_kind talk To Refine or Not to Refine list_nodes_by_kind talk Towards the post framework future list_nodes_by_kind talk Typical DDDomains In Rails Apps list_nodes_by_kind talk Understanding coupling list_nodes_by_kind talk Under The Hood And On The Surface Of Sidekiq list_nodes_by_kind+search_nodes talk UringMachine — High Performance Concurrency for Ruby Using io_uring list_nodes_by_kind talk Webmock unmocked list_nodes_by_kind talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails list_nodes_by_kind talk Why I Like Mentoring Lightning Talk list_nodes_by_kind talk Working with RailsEventStore in Cashflow Management System list_nodes_by_kind talk Write a Blog Lightning Talk list_nodes_by_kind person Paweł Strzałkowski search_nodes concept Developer vs Programmer search_nodes takeaway Be kind and build useful things search_nodes resource Better Software Design podcast search_nodes person Julik Tarkhanov search_nodes company Pragmatic Bookshelf search_nodes company YouTube search_nodes concept Command Handler search_nodes concept Command Bus search_nodes question When is a command considered processed? search_nodes takeaway Reuse Command Model Aggregate For Response search_nodes concept Command Form search_nodes concept Event Handler Error Strategy search_nodes concept Events and Commands search_nodes takeaway Action Cable Crowded-Channel Trade-off search_nodes project AnyCable search_nodes project rails_event_store/ecommerce search_nodes concept Rails Testing Pyramid (Ivan's version) search_nodes tool Cells search_nodes tool Rails Event Store Event Browser search_nodes takeaway Immutable Database Raises Mistake Cost search_nodes question How do you search across millions of events for top items? search_nodes tool rails_event_store search_nodes project Event Store (project) 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 question Sidekiq And Redis Cluster search_nodes question Application-Level Back Pressure For Sidekiq search_nodes concept Progressive Web Apps search_nodes person Paweł Pokrywka search_nodes concept Live Reload search_nodes

5 edges