Message passing vs monolith&#x27;s are orthogonal. Being a monolith has to do with deployment &amp; life cycle boundaries.  Message passing has to do with communicating state transitions between multiple logical components, possibly running at the same time (regardless of whether they are in a monolith or not).<p>If you want to compare something with message-passing architectures a better comparison would be to a shared register.  Both are abstractions around communicating a shared piece of state.  The argument that debugging a message passing abstraction is easier hinges on the idea that the message passing coordination system decouples the sender and receivers state transitions from each other, where as in a shared register the state can be viewed as the state of both.  In systems where there are more than a couple pieces of shared state it becomes untenable to put every component that <i>can</i> share state into the precise stateful configuration that you need to debug an particular case.<p>It turns out in practice, that generally it is easier to break up monolithic applications that are message based than it is to break up ones that are using shared registers, but that is a side benefit of the abstraction not the real difference between the 2.<p>I&#x27;m a huge advocate of log based architectures, which take message passing architectures to another level.  That is, message passing architectures are good at limiting the things that <i>can</i> happen, log based architectures do that and add the benefit of capturing what <i>did</i> happen.