RSSAmplifier

Blog

Event-Driven by Oskar Dudycz

Event-Driven by Oskar Dudycz

event-driven.ioRSS feed ↗106 posts

Latest posts

Vertical slices, their ownership and external dependencies

A few questions about Vertical Slices come up again and again, and they’re good ones. If a slice cuts through all the layers, do we get a…

Fixing bugs in Event Sourcing is hard, for real?

Every system ends up with bad data. Some of it comes from integrations, some from users doing things nobody predicted, and a good part of it…

Throw, Result, or neither?

There is one question I keep getting about my event-sourced code: why don’t I use ? It usually comes after someone sees a decision throwing…

On swimming, learning and my journey to being the last one

Work impacts how we live, and our lives impact how we do our work. My name is Oskar Dudycz, not Paulo Coelho, and today I’m not going to…

Addition by subtraction in Software Design

I want it all, and I want it now. This is not only a Freddie Mercury quote but also, too often, a general plan for our software product. The…

Announcing Strictland - new contract testing library for message compatibility

I just released something. It’s called Strictland. And it’s a contract testing library. Why did I do it? Before I go further, if you can’t…

You can fork a package, but can you own it?

Fork your dependencies, trim them to only your use case, never update unless it breaks for your users. I’ve been vocal about this for 1…

How soon is now in PostgreSQL?

How soon is now? In PostgreSQL, it’s not always as soon as you’d think. I learned that the hard way recently, so you don’t have to. It took…

On mashing up modelling techniques for fun and profit

Many people believe there should be one, and only one, way to model software. I think differently, I like to mix different techniques. For…

Don't overestimate domain expertise

I was toying with LLM-based domain research. It reminded me of the common mistake we make when we try to practice DDD: overreliance on what…

Vibing, Harness and OODA loop

Hey, have a look at what I made during the weekend. I had some time, grabbed a beer, turned on the computer and tried to code this feature…

Yoda Principle for better integrations

Try not. Do. Or do not. There is no try! I’m calling this the Yoda Principle. Master Yoda said that to Luke Skywalker a long time ago in a…

Anti-patterns in event modelling - Passive-Aggressive Events

Have you ever heard phrases like. Just an update, the milk ran out. Someone finished it and put the empty carton back. Or So everyone is…

The one where Oskar explains Example Mapping

One of the first indications of getting old(er) is when people stop getting your movie or music references. Of course, based on this rule…

Interactive Rubber Ducking with GenAI

You may already know that I’m a GenAI sceptic. And a general sceptic. Do you know that scepticism comes from the Greek σκέπτομαι (skeptomai…

The End of Coding? Wrong Question

Be careful what you wish for, because your wish may come true. What LLMs revealed is how many people in our industry don’t like to code. It…

Parse, Don't Guess

Last time, I shared with you how sneaky I was on transaction handling.. Today, the opposite: I’ll tell you how I fixed the issue when I…

How I cheated on transactions. Or how to make tradeoffs based on my Cloudflare D1 support

We’re being told that software design is the art of making tradeoffs. But… Are we taught how to make them? Not that it’s easy to teach…

On rebuilding read models, Dead-Letter Queues and Why Letting Go is Sometimes the Answer

In the last article, I explained how to rebuild Event-Driven Read Models in a safe and resilient way. I asked readers to let me know if they…

Rebuilding Event-Driven Read Models in a safe and resilient way

Let’s make a soup today: a blog soup. We’ll mix multiple ingredients like: events (obviously), read models, inline and async projections…

Multi-tenancy and dynamic messaging workload distribution

There are several reasons why I’m blogging. The first one is that I forget, and writing helps me to remember and organise my findings. The…

Checkpointing the message processing

Let’s start by asking you two questions. What Super Frog has to do with messaging? When was the last time you wrote if statements in SQL? If…

Consumers, projectors, reactors and all that messaging jazz in Emmett

Did you know that you can build an event store in one hour? I even did it a few times on the conference stage. Actually, it took me usually…

Requeuing Roulette in Event-Driven Architecture and Messaging

I’m always saying that there’s a thin line between good and bad practice, and this thin line is named “Context”. That’s also true for the…

Handling Events Coming in an Unknown Order

After the last article on Dealing with Race Conditions in Event-Driven Architecture with Read Models, I got such a question from Ben: You…

Dealing with Race Conditions in Event-Driven Architecture with Read Models

My events came out of order! What should I do?! Are you familiar with the term “phantom record” and its benefits? No? Let me explain it to…

How to build MongoDB Event Store

I have always said that MongoDB is not the best choice for event storage, and guess what? I just released the stable version of the MongoDB…

Idempotent Command Handling

“Is your command handling idempotent?” Sounds like a douchebag question to ask. Actually, that’s not a question but a statement that we want…

Bootstrapping CRUD with Pongo

The leitmotif of this blog is the event-driven approach. I truly believe that it’s a way to keep our applications closer to business. By…

Running a regular SQL on Pongo documents

Have you heard someone say: “We’ll use this tool because it requires a long onboarding and lots of memorisation?” You could have seen the…

Pongo behind the scenes

If you want to make God laugh, tell him about your plans. My plans were simple: recharge during summer, take a break in July, and then…

Pongo gets strongly-typed client, migrations, and command line tooling

When you think upfront and want to make things right, there’s an interesting feedback loop. Quite often, things start to click, often in a…

My Architecture Drivers

I don’t feel like an authority or an expert. I prefer to think about myself as a practitioner. Our industry is filled with self-proclaimed…

Using event metadata in event-driven projections

Some time ago, I wrote about the dangers that come from the I’ll just add one more field” attitude. Have you heard about the Broken Window…

Writing and testing event-driven projections with Emmett, Pongo and PostgreSQL

In the previous article, I told what happened when Emmett and Pongo walked into a bar. In other words, I announced that you can now do Event…

Event Sourcing on PostgreSQL in Node.js just became possible with Emmett

Last week, I announced Pongo - Mongo, but it was on PostgreSQL. So, the Node.js library allows using PostgreSQL as a document database…

Pongo - Mongo but on Postgres and with strong consistency benefits

Flexibility or Consistency? Why not have both? Wouldn’t it be great to have MongoDB flexible schema and PostgreSQL consistency? MongoDB is a…

Filtering EventStoreDB subscriptions by event types

Regular expressions are one of the classic examples of hate and hate relationships. Yes, it’s not a typo; hate and hate. Do you know anyone…

How to automatically setup pgAdmin with a Docker database

Developer experience is a phrase repeated in multiple ways. In our industry, we finally realised how important it is to reduce the cognitive…

Setting up NGINX load balancer for .NET WebApi

“Just put the load balancer in front of it, and call it a day”. But is it really that simple? Was it ever “just do XYZ?“. I was preparing a…

Combining the To-Do List and the Passage Of Time patterns for resilient business workflows

Managing processes is non-trivial. I have written about it in multiple posts and told you the horror story of the case that should have…

Let's build the worst Event Sourcing system!

Everyone likes to talk about best practices. I went the other way around and gathered all the worst practices on how to build the worst…

Why you should batch message processing and how to do it with .NET AsyncEnumerable

AsyncEnumerable is a sneaky abstraction. It allows simplified and performant usage for iterating on pull-based and push-based sources. “Pull…

Docker Compose Profiles, one the most useful and underrated features

Erik Shafer asked me on the Emmett Discord if I could provide a sample of how to run the WebApi application using Emmett. Of course, I said…

How to write a left-fold streams collector in Java

Last week, we covered the latest improvements to Java 22 around pattern matching and records. They enable explicit business logic modelling…

This is not your uncle's Java! Modelling with Java 22 records pattern matching in practice

I like learning new things. It stimulates my creativity, helps me gain diverse perspectives, and helps me be humble. When you’re a notorious…

How to configure a custom Test Container on the EventStoreDB example

Testcontainers became a popular way of setting up dependencies for integration testing. They’re not ideal, as configuring them to run your…

Mocking the native Node.js Test Runner

Last week, we discussed an overused but applicable pattern: in-memory bus. This time, we’ll continue with the leitmotif and talk about…

How to build an in-memory Message Bus in TypeScript

I’m writing this article on Friday, and it’s about time to have some fun. As this is a programming blog, let’s have some fun coding. Let’s…

Event modelling anti-patterns explained

Have you heard about Passive Aggressive Events or CRUD sourcing? Or maybe about the Clickbait event? If you don’t, you better check the talk…