April 23, 2025
ServiceComposer contract-less composition request handlers
Recently, I started thinking about evolving the ServiceComposer user-facing API. I was faced with many options, leading me to analysis paralysis. I decided to start with a principle first: The feel-at-home ServiceComposer principle. This principle led me to introduce a new syntax that mimics ASP.NET controllers for defining composition handlers. This syntax helps users reduce the learning and adoption curve. Let's take a look, shall we?
All the new goodies in ServiceComposer
Thanks to users’ feedback, I enjoyed working on some new cool ServiceComposer features, namely endpoint filters, a greatly improved event handling API, and declarative model binding, which paves the way for a new cool feature in the works
Happy 20 years, dear blog
I’ve been blogging for the last twenty years, with ups and downs. Nonetheless, it’s a milestone to celebrate.
A small ServiceControl maintenance utility
From time to time, I enjoy writing code on the side, like an open-source project. This time, the opportunity came from a support case and the need to ease the customer's life in their daily maintenance tasks.
Someone says event, and magically, coupling goes away
I feel events are used too many times as a hammer to dismantle coupling. Unfortunately, it's gold plating. It might look better, but it'll fire back in the long term and cost more.
I gotta tell you: CQRS doesn't imply Event Sourcing
Too many times, Event Sourcing is presented as the natural companion to CQRS. That's not the case. CQRS doesn't dictate using Event Sourcing. Let's see why.
Mattox: simple, pre-configured NServiceBus endpoints
NServiceBus endpoints support only code-based configuration, which is handy and not always friendly at the same time. But what if we could plug in the superb Microsoft configuration extensions to configure NServiceBus endpoints?
Compensation is all around us
In a message-based system, we might feel a lack of control, especially when in need of compensating changes spread across the system. Fear not! Real life deals with compensation every day! And it's better than rolling back a transaction or deleting some data in the database.
Define messages as POCO, interfaces, or records. Does it really matter?
.NET developers building message-based systems seem to give serialization and surrounding concerns more importance than needed. Let's try to dissect the topic
The power of timeouts to compensate for failures and other tales
There are scenarios when a chatty services relationship seems the only option, with the results of coupling quickly becoming our best friend. Not all hope is lost, we can try to ask different questions to untangle the knot.
Append-only models: The why, the when, and the how
There are scenarios where updating data is either forbidden by policies or undesirable because it hinders the ability to fulfill other requirements. That is when append-only models come to the rescue.
Why all this fuss about eventual consistency? It's everywhere!
Our industry seems to worry A LOT about eventual consistency. The real world is eventually consistent by definition. Still, we continuously try to fit a square peg into a round hole. Why is that, and what can we do about it?
Eight months with the Kindle Scribe
I've been using a Kindle Scribe since December 2022. Primarily for reading and, from time to time, for note taking. Would I buy it knowing what I know today? No.
The guilt that comes with flexible working hours
I've been working remotely for Particular Software for the last ten years. To this day, I still feel guilty for taking time off during regular working hours, even though we don't have working hours at all. Why is that?
What if my command was rejected?
Distributed systems are different and require a different mindset. That's particularly true when dealing with async processes and failures. We need new tools and a new toolbox. And in the end, we can avoid rejecting that command.
Back to Basics: commands, events, and messages
When you're involved with something for a very long time, it's easy to fall into the trap of taking many concepts for granted. Let's go back to the basics and build a common foundation. Today's topics are commands, events, and messages.
Back to Basics: service boundaries, autonomous components, and coupling
When you're involved with something for a very long time, it's easy to fall into the trap of taking many concepts for granted. Let's go back to the basics and build a common foundation. Today's topics are service boundaries, autonomous components, and coupling.
How many (micro)services do I need?
Microservices, microservices everywhere. But how many of them do we need? It's easy to be trapped by the micro thing and end up with thousands of them. Let's try to provide some guidance.
What's an Outbox and why do we need it? Hint: it's about data integrity
Distributed systems are ugly beasts sometimes. They hide subtle tricks that can lead to data loss and system corruption. The Outbox pattern helps address a couple of them.