{"id":3863,"date":"2026-04-05T20:28:00","date_gmt":"2026-04-05T23:28:00","guid":{"rendered":"https:\/\/sanadalabs.com\/?p=3863"},"modified":"2026-04-22T21:41:19","modified_gmt":"2026-04-23T00:41:19","slug":"seu-sistema-nao-falha-uma-vez-ele-falha-varias","status":"publish","type":"post","link":"https:\/\/sanadalabs.com\/en\/seu-sistema-nao-falha-uma-vez-ele-falha-varias\/","title":{"rendered":"Seu sistema n\u00e3o falha uma vez. Ele falha v\u00e1rias."},"content":{"rendered":"<h1 class=\"wp-block-heading\">Seu sistema n\u00e3o falha uma vez. Ele falha v\u00e1rias.<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Japa Tela Preta #6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma suposi\u00e7\u00e3o silenciosa que quase todo mundo faz quando est\u00e1 desenvolvendo um sistema: as coisas acontecem uma vez.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma requisi\u00e7\u00e3o chega, um processo executa, o dado \u00e9 salvo, fim. Linear, previs\u00edvel, limpo. No papel, tudo faz sentido. Voc\u00ea implementa o fluxo, testa, valida e segue em frente com a sensa\u00e7\u00e3o de que aquilo est\u00e1 resolvido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00f3 que produ\u00e7\u00e3o n\u00e3o funciona assim.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teve um caso cl\u00e1ssico que deixa isso muito claro. Um fluxo de pagamento aparentemente simples: o sistema recebia a confirma\u00e7\u00e3o de um gateway, registrava o pagamento e seguia o processo normal. Tudo certo, funcionando como esperado\u2026 at\u00e9 come\u00e7arem a aparecer pagamentos duplicados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A primeira rea\u00e7\u00e3o, de novo, foi procurar bug. Alguma valida\u00e7\u00e3o faltando, algum controle mal feito, alguma condi\u00e7\u00e3o que deixou passar. Mas quando fomos investigar mais fundo, a realidade era outra.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O gateway estava reenviando a mesma notifica\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o por erro. Por seguran\u00e7a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ele n\u00e3o tinha certeza de que o sistema tinha recebido corretamente, ent\u00e3o fazia o que qualquer sistema resiliente faz: tentava de novo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E o nosso sistema? Processava de novo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem questionar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem prote\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem saber que aquilo j\u00e1 tinha sido feito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resultado: o mesmo pagamento registrado duas vezes, gerando efeitos em cascata no resto do sistema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E esse tipo de cen\u00e1rio n\u00e3o \u00e9 exce\u00e7\u00e3o. Ele \u00e9 o padr\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma mensagem pode ser entregue mais de uma vez. Um job pode rodar novamente. Um retry pode acontecer sem voc\u00ea perceber. Uma fila pode reprocessar eventos depois de uma falha. E tudo isso acontece justamente quando o sistema est\u00e1 tentando se manter saud\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja, o problema n\u00e3o vem do erro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vem da recupera\u00e7\u00e3o do erro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 nesse ponto que muita gente entende, da pior forma, um conceito que parecia desnecess\u00e1rio at\u00e9 ent\u00e3o: <strong>idempot\u00eancia<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Idempot\u00eancia n\u00e3o \u00e9 teoria bonita. \u00c9 garantia pr\u00e1tica de que uma opera\u00e7\u00e3o pode acontecer v\u00e1rias vezes sem causar efeitos colaterais indesejados. Voc\u00ea pode executar duas, tr\u00eas ou dez vezes\u2026 e o estado final continua o mesmo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem isso, cada retry vira um risco.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com isso, retry vira uma rede de seguran\u00e7a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Porque voc\u00ea para de depender da premissa de que \u201cisso s\u00f3 vai acontecer uma vez\u201d e come\u00e7a a aceitar a realidade: em sistemas distribu\u00eddos, <strong>repeti\u00e7\u00e3o \u00e9 inevit\u00e1vel<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E quando voc\u00ea constr\u00f3i assumindo isso, o comportamento muda completamente. O sistema deixa de ser fr\u00e1gil a duplicidade, deixa de sofrer com reprocessamento e passa a lidar com falhas de forma muito mais previs\u00edvel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No come\u00e7o, voc\u00ea escreve c\u00f3digo pensando no caminho ideal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois, voc\u00ea come\u00e7a a projetar pensando no que acontece quando o caminho ideal n\u00e3o acontece.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E isso inclui aceitar que opera\u00e7\u00f5es v\u00e3o se repetir, mensagens v\u00e3o duplicar e eventos v\u00e3o chegar fora de ordem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sistemas maduros n\u00e3o s\u00e3o aqueles que evitam falhas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e3o aqueles que continuam corretos mesmo quando as coisas acontecem mais de uma vez.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E quando voc\u00ea vira essa chave, voc\u00ea para de tentar construir um sistema \u201cperfeito\u201d\u2026<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">e come\u00e7a a construir um sistema que <strong>aguenta o mundo real<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Seu sistema n\u00e3o falha uma vez. Ele falha v\u00e1rias. Japa Tela Preta #6 Existe uma suposi\u00e7\u00e3o silenciosa que quase todo mundo faz quando est\u00e1 desenvolvendo um sistema: as coisas acontecem uma vez. Uma requisi\u00e7\u00e3o chega, um processo executa, o dado \u00e9 salvo, fim. Linear, previs\u00edvel, limpo. No papel, tudo faz sentido. Voc\u00ea implementa o fluxo, [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":3870,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,34],"tags":[39,41,42,36,40,37,38,43],"class_list":["post-3863","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-japa-tela-preta","category-tecnologia","tag-arquiteturadesoftware","tag-desenvolvimentodesoftware","tag-engenhariadesoftware","tag-japatelapreta","tag-programacao","tag-softwareengineering","tag-systemdesign","tag-techlead"],"_links":{"self":[{"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/posts\/3863","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/comments?post=3863"}],"version-history":[{"count":2,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/posts\/3863\/revisions"}],"predecessor-version":[{"id":3876,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/posts\/3863\/revisions\/3876"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/media\/3870"}],"wp:attachment":[{"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/media?parent=3863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/categories?post=3863"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sanadalabs.com\/en\/wp-json\/wp\/v2\/tags?post=3863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}