Syn­chro­nous mi­croser­vices look great on pa­per.

They are easy to read, easy to de­bug, and they map per­fect­ly to how we think: “I send a re­quest, I get a re­ply.” No sur­pris­es, right?

Ex­cept when things go wrong. Which in dis­trib­uted sys­tems is most of the time.

The Hid­den Cost of Syn­chro­nous Calls

Let’s say you have got five mi­croser­vices: 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 “sub­mit” and gets a spin­ning loader - or worse, a 500 er­ror.

Con­grat­u­la­tions: your high­ly mod­u­lar mi­croser­vice ar­chi­tec­ture just turned into a mono­lith with sin­gle-point-of-fail­ure be­hav­ior.

And fix­ing it? That’s where things get messy.

Engi­neers start bolt­ing on cir­cuit break­ers, re­tries, back­off strate­gies, and com­pen­sat­ing log­ic. Sud­den­ly, your clean ser­vice is a jun­gle of re­silience code.

All of this just to cope with the fact that one ser­vice might be tem­porar­i­ly of­fline.

You Don’t Need 100% Up­time Every­where

Most mi­croser­vices don’t need to be up 100% of the time.
  • Maybe it’s fine for your re­port­ing ser­vice to catch up lat­er.
  • Maybe it’s fine for in­ven­to­ry up­dates to lag a lit­tle.

What you do need is a way to avoid cas­cad­ing fail­ure.

This is where asyn­chro­nous mes­sag­ing shines.

The Asyn­chro­nous Ad­van­tage

By de­cou­pling the sender and the re­ceiv­er, you can:
  • De­ploy with­out down­time: just drain the queue
  • Scale au­to­mat­i­cal­ly with com­pet­ing con­sumers
  • Tol­er­ate crash­es with­out los­ing mes­sages
  • Add new pro­cess­ing log­ic with­out touch­ing the sender
Asyn­chro­nous mes­sag­ing gives you loose cou­pling, which is a fan­cy way of say­ing “my stuff keeps work­ing even if yours doesn’t.”

But Wait - What About De­liv­ery Guar­an­tees?

Here is where it gets tricky.

It’s easy to send a mes­sage asyn­chro­nous­ly.

It’s hard­er to make sure it gets processed ex­act­ly once.

Most bro­kers don’t do that out of the box. Kaf­ka? Rab­bitMQ? They re­al­ly only give you best-ef­fort guar­an­tees.

Which leads right back to the prob­lem you were try­ing to avoid: lost up­dates, du­pli­cates, re­tries.

This is why we ad­vo­cate for XA-backed mes­sag­ing, even in mod­ern mi­croser­vice stacks.

Yes, XA. The thing peo­ple love to hate.

The Modern Take on XA: Light­weight, Cloud-Na­tive, and Fast

Atomikos brings XA into the cloud era. It works with Spring Boot, JDBC, JMS, Hiber­nate — no heavy­weight app servers need­ed.

And with LogCloud, you get de­cen­tral­ized re­cov­ery, even in con­tainer­ized, crash-prone en­vi­ron­ments.

What does this mean in prac­tice?
  • No more phan­tom mes­sages
  • No more miss­ing up­dates
  • No more frag­ile re­tries
Just ex­act­ly-once de­liv­ery, front to back.

TL;DR

  • Syn­chro­nous calls tie your avail­abil­i­ty to your weak­est ser­vice
  • Asyn­chro­nous mes­sag­ing gives you flex­i­bil­i­ty, scale, and re­silience
  • Most bro­kers don’t guar­an­tee ex­act­ly-once de­liv­ery
  • Atomikos + XA = ex­act­ly-once, cloud-na­tive, no re­tries

If you are se­ri­ous about up­time and con­sis­ten­cy, it’s time to ditch the syn­chro­nous habit.

Get start­ed with Atomikos and mod­ern­ize your mes­sag­ing — the re­li­able way.
RSS

Comments

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