Synchronous microservices look great on paper.

They are easy to read, easy to debug, and they map perfectly to how we think: “I send a request, I get a reply.” No surprises, right?

Except when things go wrong. Which in distributed systems is most of the time.

The Hidden Cost of Synchronous Calls

Let’s say you have got five microservices: MS1 through MS5. MS1 calls MS2, MS2 calls MS3, and so on.

If any one of them is down, the whole chain fails. Your user hits “submit” and gets a spinning loader - or worse, a 500 error.

Congratulations: your highly modular microservice architecture just turned into a monolith with single-point-of-failure behavior.

And fixing it? That’s where things get messy.

Engineers start bolting on circuit breakers, retries, backoff strategies, and compensating logic. Suddenly, your clean service is a jungle of resilience code.

All of this just to cope with the fact that one service might be temporarily offline.

You Don’t Need 100% Uptime Everywhere

Most microservices don’t need to be up 100% of the time.
  • Maybe it’s fine for your reporting service to catch up later.
  • Maybe it’s fine for inventory updates to lag a little.

What you do need is a way to avoid cascading failure.

This is where asynchronous messaging shines.

The Asynchronous Advantage

By decoupling the sender and the receiver, you can:
  • Deploy without downtime: just drain the queue
  • Scale automatically with competing consumers
  • Tolerate crashes without losing messages
  • Add new processing logic without touching the sender
Asynchronous messaging gives you loose coupling, which is a fancy way of saying “my stuff keeps working even if yours doesn’t.”

But Wait - What About Delivery Guarantees?

Here is where it gets tricky.

It’s easy to send a message asynchronously.

It’s harder to make sure it gets processed exactly once.

Most brokers don’t do that out of the box. Kafka? RabbitMQ? They really only give you best-effort guarantees.

Which leads right back to the problem you were trying to avoid: lost updates, duplicates, retries.

This is why we advocate for XA-backed messaging, even in modern microservice stacks.

Yes, XA. The thing people love to hate.

The Modern Take on XA: Lightweight, Cloud-Native, and Fast

Atomikos brings XA into the cloud era. It works with Spring Boot, JDBC, JMS, Hibernate — no heavyweight app servers needed.

And with LogCloud, you get decentralized recovery, even in containerized, crash-prone environments.

What does this mean in practice?
  • No more phantom messages
  • No more missing updates
  • No more fragile retries
Just exactly-once delivery, front to back.

TL;DR

  • Synchronous calls tie your availability to your weakest service
  • Asynchronous messaging gives you flexibility, scale, and resilience
  • Most brokers don’t guarantee exactly-once delivery
  • Atomikos + XA = exactly-once, cloud-native, no retries

If you are serious about uptime and consistency, it’s time to ditch the synchronous habit.

Get started with Atomikos and modernize your messaging — the reliable way.

Add a comment

Corporate Information

Atomikos Corporate Headquarters
Hoveniersstraat, 39/1, 2800
Mechelen, Belgium

Contact Us

Copyright 2026 Atomikos BVBA | Our Privacy Policy
By using this site you agree to our cookies. More info. That's Fine