Pular para o conteúdo principal

Transação HTTP - Acredite, ideia do Tech Lead

· 3 min para ler
Dev Cansado
Dev Full Stack Especialista XGH

Tem dias em que você acorda, abre o Teams e já sabe que vai sofrer.

Porque aparece aquela mensagem do Tech Lead:

“Pessoal, precisamos garantir atomicidade nas integrações.
Vamos criar uma transação para nossas chamadas HTTP.”

E aí você pensa:

“Mano… como… em qual planeta…?”

Mas respira.
Porque a desgraça está só começando.


🧠 O TL iluminado

Na cabeça dele, tudo funciona assim:

  • chamamos um serviço externo

  • fazemos outra chamada

  • depois outra

  • no final damos um commit

E, se algo der errado:

“É só dar um rollback, oras.”

Sim. Um rollback.
De uma API externa.
Que você não controla.
Que você nem sabe se tá no ar.

É bonito demais.
É poesia.
É ficção científica nível Marvel.


💥 O choque com a realidade

Aí você tenta explicar, com paciência de monge budista:

  • HTTP é stateless

  • API externa não sabe que está em uma transação

  • você não controla consistência distribuída

  • rollback não existe nesse universo

  • commit também não

  • o protocolo não tem ACID

  • isso é literalmente contra o modelo do REST

E mesmo assim o Tech Lead responde com a confiança de quem nunca estudou nada:

“Cara, não complica. É só salvar tudo no banco depois que as chamadas derem sucesso.”

Ah, claro.
Porque nada nunca falha.
Chamadas externas sempre respondem.
Timeout não existe.
Particionamento de rede é lenda urbana.


👇 A implementação genial do TL

O PR vem assim:

using (var transaction = _db.Database.BeginTransaction())
{
var r1 = await _http.PostAsync("servicoA");
var r2 = await _http.PostAsync("servicoB");
var r3 = await _http.PostAsync("servicoC");

if (r1.IsSuccessStatusCode && r2.IsSuccessStatusCode && r3.IsSuccessStatusCode)
transaction.Commit();
else
transaction.Rollback();
}

E você pensa:

“Rollback do quê, irmão?
Do post no serviço C??
Do gateway que nem tem idempotência??
Do microserviço que você nem controla??”

Seja honesto:
esse código não tem transação.
Esse código tem esperança.


🧨 Quando tudo explode

A vida cobra caro.

  • servico A responde

  • servico B responde

  • servico C cai

  • o TL abre o console e fala:

    “Ué, mas deu rollback. Tá garantido.”

Só que não.
Porque:

  • serviço A salvou

  • serviço B processou

  • serviço C morreu

  • e agora você tem dados zumbis pendurados em 2 serviços diferentes

  • em ambientes diferentes

  • com timeouts diferentes

  • e ainda tem que ouvir:

    “Devops, arruma aí.”

Rollback?
Só se for do dev desistindo do emprego.


🔥 Moral da história

Transação HTTP não existe.
Nunca existiu.
E se alguém disser que existe, fuja.

Chamadas remotas exigem:

  • compensações, não rollback

  • idempotência

  • persistência baseada em estado eventual

  • saga pattern

  • mensageria adequada

Mas o Tech Lead não quer aprender isso.
Ele quer um botão de commit e outro de rollback, igual ao SQL Server Manager.

E é por isso que:

a TI brasileira segue alimentando o caos
com PRs que deveriam ser classificados como fanfic.