Great article! Not sure developers which never did work with event driven system will understand the pain and the challenges.

We use similar setups, except the CRUD. We hate CRUD for business flows... So we did step forward and implemented business events.

We use outbox pattern, which allows us to publish business events and make mutations to the object in a single transaction.

Then, we use CDC to capture changes only on outbox table/collection. As result, we have publishing guarantees, we don't loose the context, and we don't expose our internal data storage structure (business events have own schemas).

The dream is to have event sourcing, but it's too expensive :/