Transação HTTP - Acredite, ideia do Tech Lead
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 Aresponde -
servico Bresponde -
servico Ccai -
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.