<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sem categoria Archives - essencia.dev</title>
	<atom:link href="https://essencia.dev/categoria/sem-categoria/feed/" rel="self" type="application/rss+xml" />
	<link>https://essencia.dev/categoria/sem-categoria/</link>
	<description>Tecnologia, desenvolvimento e arquitetura de software com profundidade</description>
	<lastBuildDate>Tue, 06 Jan 2026 03:56:53 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://essencia.dev/wp-content/uploads/2025/12/essencia.dev-laranja-caneca-150x150.png</url>
	<title>Sem categoria Archives - essencia.dev</title>
	<link>https://essencia.dev/categoria/sem-categoria/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</title>
		<link>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/</link>
					<comments>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 19:27:10 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://essencia.dev/?p=35</guid>

					<description><![CDATA[<p>Plataformas como X, Discord e Instagram expõem identificadores numéricos longos, aparentemente aleatórios — mas que, na prática, seguem uma lógica muito bem definida. Neste artigo, vamos entender: Unicidade é só o requisito mínimo Quando falamos em identificadores, quase todo mundo concorda em um ponto: Um ID precisa ser único. Mas em sistemas reais, distribuídos e [&#8230;]</p>
<p>The post <a href="https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/">Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="is-style-text-display has-x-large-font-size is-style-text-display--2">Plataformas como X, Discord e Instagram expõem identificadores numéricos longos, aparentemente aleatórios — mas que, na prática, seguem uma lógica muito bem definida.</p>



<p>Neste artigo, vamos entender:</p>



<ul class="wp-block-list is-style-checkmark-list">
<li>Por que unicidade não é o único requisito de um ID</li>



<li>As limitações de IDs sequenciais e UUIDs em sistemas distribuídos</li>



<li>O que são Snowflake IDs e como eles funcionam</li>



<li>Por que grandes APIs adotam esse modelo</li>



<li>Quando essa estratégia faz sentido (e quando não faz)</li>
</ul>



<h2 class="wp-block-heading">Unicidade é só o requisito mínimo</h2>



<p>Quando falamos em identificadores, quase todo mundo concorda em um ponto:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Um ID precisa ser único.</strong></p>
</blockquote>



<p>Mas em sistemas reais, distribuídos e em produção, isso está longe de ser suficiente.</p>



<p>Em APIs modernas, bons identificadores também precisam:</p>



<ul class="wp-block-list">
<li>Ser gerados sem coordenação central</li>



<li>Funcionar bem com múltiplas instâncias</li>



<li>Não virar gargalo de performance</li>



<li>Permitir paralelismo</li>



<li>Não vazar informações sensíveis do negócio</li>



<li>Ajudar (e não atrapalhar) observabilidade e operação</li>
</ul>



<p>Ou seja: <strong>unicidade é o requisito mínimo, não o objetivo final</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O problema dos sistemas distribuídos</h2>



<p>Em arquiteturas distribuídas lidamos com:</p>



<ul class="wp-block-list">
<li>Auto scaling</li>



<li>Múltiplos serviços</li>



<li>Concorrência real</li>



<li>Execução paralela</li>



<li>Múltiplas regiões</li>



<li>Infraestrutura dinâmica</li>
</ul>



<p>Nesse cenário, deixar a geração de IDs:</p>



<ul class="wp-block-list">
<li>centralizada no banco</li>



<li>dependente de sequência</li>



<li>ou altamente acoplada a um único ponto</li>
</ul>



<p>é pedir para criar gargalos.</p>



<p>IDs sequenciais funcionam muito bem… <strong>até deixarem de funcionar</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">UUIDs resolvem tudo? Mais ou menos</h2>



<p>UUIDs (ou GUIDs) são extremamente populares — e com bons motivos.</p>



<p>Eles oferecem:</p>



<ul class="wp-block-list">
<li>Unicidade global</li>



<li>Geração totalmente descentralizada</li>



<li>Suporte nativo em praticamente todas as linguagens</li>



<li>Facilidade para geração no frontend, backend ou offline</li>
</ul>



<p>Isso os torna uma excelente escolha para:</p>



<ul class="wp-block-list">
<li>Integrações externas</li>



<li>Sistemas sem controle rígido de infraestrutura</li>



<li>Sincronizações offline</li>



<li>Casos onde flexibilidade é mais importante que controle</li>
</ul>



<p>Mas essa flexibilidade vem com um custo.</p>



<p>UUIDs:</p>



<ul class="wp-block-list">
<li>Não carregam significado operacional</li>



<li>São ruins para ordenação temporal (especialmente V4)</li>



<li>Geram índices grandes (128 bits)</li>



<li>Podem degradar performance em tabelas massivas</li>



<li>Não ajudam na observabilidade</li>
</ul>



<p>Em muitos casos, <strong>unicidade global não é tudo o que o negócio precisa</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Quando você quer mais controle que o UUID oferece</h2>



<p>Agora imagine que você queira:</p>



<ul class="wp-block-list">
<li>Saber quando um registro foi criado apenas olhando o ID</li>



<li>Garantir ordenação temporal forte</li>



<li>Evitar gargalo no banco</li>



<li>Melhorar eficiência de índices</li>



<li>Facilitar particionamento</li>



<li>Ter previsibilidade operacional</li>
</ul>



<p>É nesse ponto que entra o <strong>Snowflake ID</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é um Snowflake ID?</h2>



<p>Snowflake IDs são identificadores numéricos de <strong>64 bits</strong>, criados originalmente pelo Twitter por volta de 2010 para identificar tweets em um sistema altamente distribuído.</p>



<p>A ideia central não é apenas gerar um ID único, mas <strong>controlar como ele é gerado</strong>.</p>



<p>A estrutura clássica do Snowflake é:</p>



<ul class="wp-block-list">
<li><strong>1 bit</strong>: sempre zero (sinal)</li>



<li><strong>41 bits</strong>: timestamp (baseado em uma época customizada)</li>



<li><strong>10 bits</strong>: identificador do nó / instância</li>



<li><strong>12 bits</strong>: sequência local naquele nó</li>
</ul>



<p>Isso permite:</p>



<ul class="wp-block-list">
<li>Até <strong>4.096 IDs por milissegundo por nó</strong></li>



<li>Milhões de IDs por segundo em escala horizontal</li>



<li>Geração totalmente local, sem coordenação central</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">IDs que já nascem distribuídos</h2>



<p>Uma característica fundamental do Snowflake é que:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>cada nó é responsável por gerar seus próprios IDs</strong>.</p>



<p>Isso elimina:</p>



<ul class="wp-block-list">
<li>Locks globais</li>



<li>Dependência do banco</li>



<li>Gargalos de sequência</li>



<li>Contenção em ambientes paralelos</li>
</ul>



<p>O banco deixa de ser o “gerador de IDs” e passa a ser apenas um consumidor deles.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">IDs que contam uma história</h2>



<p>Um efeito colateral (positivo) dessa estrutura é que os Snowflake IDs são <strong>temporalmente ordenáveis</strong>.</p>



<p>Isso significa que:</p>



<ul class="wp-block-list">
<li>Você pode ordenar registros pelo ID</li>



<li>Extrair data e hora de criação</li>



<li>Identificar picos de tráfego</li>



<li>Analisar padrões operacionais</li>
</ul>



<p>Tudo isso <strong>sem metadados adicionais</strong>.</p>



<p>O próprio ID já carrega essas informações.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Por que grandes APIs usam Snowflakes?</h2>



<p>Agora fica mais fácil entender por que grandes plataformas adotam esse modelo.</p>



<p>Entre os principais benefícios:</p>



<ul class="wp-block-list">
<li>Menor acoplamento ao banco de dados</li>



<li>Melhor eficiência de índices (64 bits)</li>



<li>Ordenação temporal natural</li>



<li>Excelente suporte a particionamento</li>



<li>Melhor observabilidade</li>



<li>Geração previsível e controlada</li>
</ul>



<p>No Instagram, por exemplo, os bits que representariam o nó físico são usados para identificar <strong>shards lógicos</strong>.<br>No Discord, esses bits são divididos entre <strong>worker</strong> e <strong>processo</strong>.</p>



<p>Ou seja: o conceito é o mesmo, mas a implementação se adapta à infraestrutura.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Os custos e riscos dessa estratégia</h2>



<p>Snowflake IDs <strong>não são uma bala de prata</strong>.</p>



<p>Eles exigem:</p>



<ul class="wp-block-list">
<li>Configuração correta de infraestrutura</li>



<li>Garantia absoluta de unicidade do ID do nó</li>



<li>Disciplina arquitetural</li>



<li>Sincronização de relógio (clock drift)</li>



<li>Estratégia clara de deploy e autoscaling</li>
</ul>



<p>Além disso:</p>



<ul class="wp-block-list">
<li>Snowflake <strong>não é um padrão formal</strong></li>



<li>Não existe uma RFC</li>



<li>Cada implementação é uma variação</li>
</ul>



<p>Isso traz flexibilidade, mas também responsabilidade.</p>



<p>Outro ponto importante:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Snowflakes <strong>vazam informação temporal</strong>.<br>Se isso for um problema para o seu negócio, essa estratégia pode não ser adequada.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Snowflake vs UUID: um resumo honesto</h2>



<p><strong>UUIDs</strong></p>



<ul class="wp-block-list">
<li>Simples</li>



<li>Amplamente suportados</li>



<li>Flexíveis</li>



<li>Ótimos para começar</li>



<li>Pouco controle</li>



<li>Pior performance em escala extrema</li>
</ul>



<p><strong>Snowflake IDs</strong></p>



<ul class="wp-block-list">
<li>Controle explícito</li>



<li>Excelente para sistemas distribuídos</li>



<li>Melhores índices</li>



<li>Ordenação temporal</li>



<li>Mais complexidade</li>



<li>Forte dependência da infraestrutura</li>
</ul>



<p>Não existe “melhor ID universal”.<br>Existe <strong>o ID certo para o seu contexto</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Identificadores são decisão arquitetural</h2>



<p>Talvez o ponto mais importante de todo esse artigo seja este:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>A escolha do identificador não é detalhe de implementação.</strong></p>
</blockquote>



<p>Ela impacta:</p>



<ul class="wp-block-list">
<li>Escalabilidade</li>



<li>Observabilidade</li>



<li>Performance</li>



<li>Segurança</li>



<li>Evolução do sistema</li>
</ul>



<p>Escolher entre ID sequencial, UUID ou Snowflake é escolher <strong>como seu sistema cresce, opera e se mantém</strong>.</p>



<p>E isso é, por definição, uma decisão arquitetural.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Grandes APIs não escolhem Snowflake IDs por moda ou acaso.</p>



<p>Elas escolhem porque:</p>



<ul class="wp-block-list">
<li>Precisam de controle</li>



<li>Precisam de escala</li>



<li>Precisam de previsibilidade</li>



<li>Precisam operar sistemas distribuídos reais</li>
</ul>



<p>UUIDs continuam sendo excelentes ferramentas.<br>Snowflakes são ferramentas mais especializadas.</p>



<p>Saber <strong>quando usar cada uma</strong> é o que separa uma decisão técnica de uma decisão arquitetural.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Se quiser, no próximo artigo a gente pode explorar:</p>



<ul class="wp-block-list">
<li>UUID V7 vs Snowflake</li>



<li>NanoID, KSUID, ULID</li>



<li>IDs naturais</li>



<li>Estratégias híbridas</li>



<li>Impacto direto em bancos relacionais</li>
</ul>



<p>Se esse tema te fez repensar a forma como você cria IDs nas suas APIs, comenta lá no blog ou compartilha com o time.<br>Essa discussão vale muito a pena continuar.</p>



<p></p>
<p>The post <a href="https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/">Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/snowflake-ids-por-que-grandes-apis-evitam-uuids-como-identificadores-publicos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</title>
		<link>https://essencia.dev/ola-mundo/</link>
					<comments>https://essencia.dev/ola-mundo/#respond</comments>
		
		<dc:creator><![CDATA[Bernardo Lobato]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 17:38:15 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">http://essencia.dev/?p=1</guid>

					<description><![CDATA[<p>Se você trabalha com backend, APIs ou sistemas distribuídos, existe uma verdade inevitável que cedo ou tarde aparece em produção: 👉 Chamadas duplicadas vão acontecer. Elas surgem por retry automático, timeout de rede, instabilidade de internet, falhas intermediárias, consumidores paralelos ou, simplesmente, pelo famoso “dedo nervoso” do usuário clicando várias vezes no mesmo botão. E [&#8230;]</p>
<p>The post <a href="https://essencia.dev/ola-mundo/">Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Se você trabalha com backend, APIs ou sistemas distribuídos, existe uma verdade inevitável que cedo ou tarde aparece em produção:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Chamadas duplicadas vão acontecer.</p>



<p>Elas surgem por retry automático, timeout de rede, instabilidade de internet, falhas intermediárias, consumidores paralelos ou, simplesmente, pelo famoso “dedo nervoso” do usuário clicando várias vezes no mesmo botão.</p>



<p>E o problema não é a duplicação em si — o problema é o que o seu sistema faz quando ela acontece.</p>



<p>Neste artigo, vamos entender:</p>



<p>O que é idempotência (de verdade, sem buzzword)</p>



<p>Por que chamadas duplicadas são a regra, não a exceção</p>



<p>Exemplos reais de problemas causados por falta de idempotência</p>



<p>Estratégias para tratar duplicidade corretamente</p>



<p>Quando idempotência é obrigatória, desejável ou overengineering</p>



<p>O problema das chamadas duplicadas</p>



<p>Vamos começar com alguns exemplos comuns do mundo real.</p>



<ol class="wp-block-list">
<li>Retry e timeout no frontend</li>
</ol>



<p>Imagine um endpoint POST /pagamentos.</p>



<p>O fluxo é simples:</p>



<p>O cliente chama a API</p>



<p>O backend processa o pagamento</p>



<p>O banco é atualizado</p>



<p>O cliente recebe a resposta</p>



<p>Agora adicione uma variável muito comum: internet instável.</p>



<p>O pagamento é processado com sucesso, mas o cliente não recebe a resposta por causa de um timeout. O frontend, bem programado, aplica uma política de retry e dispara a mesma requisição novamente.</p>



<p>Resultado:</p>



<p>O sistema “funcionou”</p>



<p>Não houve erro técnico</p>



<p>Mas o usuário pode ser cobrado duas vezes</p>



<p>Tecnicamente resiliente. Arquiteturalmente frágil.</p>



<ol start="2" class="wp-block-list">
<li>Confirmação de e-mail e tokens inválidos</li>
</ol>



<p>Outro exemplo clássico: POST /usuarios/confirmar-email.</p>



<p>O usuário clica no botão para receber o token.<br>Clica de novo.<br>Clica de novo.<br>Clica de novo.</p>



<p>Cada clique gera um novo token, invalidando o anterior.</p>



<p>Resultado:</p>



<p>O usuário recebe vários e-mails</p>



<p>Nenhum token funciona</p>



<p>A experiência degrada</p>



<p>O suporte recebe chamados</p>



<p>Tudo isso porque o sistema assumiu que a chamada aconteceria uma única vez.</p>



<ol start="3" class="wp-block-list">
<li>Geração de relatórios pesados</li>
</ol>



<p>Agora imagine um endpoint que gera um relatório complexo:</p>



<p>Várias queries</p>



<p>Processamento pesado</p>



<p>Geração de PDF</p>



<p>Se múltiplas requisições iguais chegam ao mesmo tempo, você pode:</p>



<p>Saturar o banco</p>



<p>Travar o sistema</p>



<p>Gerar o mesmo relatório várias vezes desnecessariamente</p>



<p>O erro conceitual por trás de tudo isso</p>



<p>Esses exemplos têm algo em comum:</p>



<p>Assumem que a chamada acontece uma única vez</p>



<p>Geram efeitos colaterais indesejados quando isso não acontece</p>



<p>Em ambientes distribuídos, isso nunca é uma premissa válida.</p>



<p>É aqui que entra o conceito de idempotência.</p>



<p>O que é idempotência?</p>



<p>O termo vem da matemática, mais especificamente da álgebra abstrata.</p>



<p>Uma operação idempotente é aquela que:</p>



<p>não importa quantas vezes seja aplicada com as mesmas entradas, o resultado final é sempre o mesmo.</p>



<p>Exemplos do mundo real:</p>



<p>Botão de elevador</p>



<p>Botão de emergência</p>



<p>Botão de “parar” de uma máquina</p>



<p>A expectativa é simples:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> apertar uma vez ou dez vezes produz o mesmo efeito.</p>



<p>Em APIs e backends, deveria ser exatamente assim.</p>



<p>Idempotência em sistemas</p>



<p>Aplicar idempotência significa garantir que:</p>



<p>Chamadas duplicadas não quebram o sistema</p>



<p>Efeitos colaterais não se repetem</p>



<p>O estado só muda quando realmente precisa mudar</p>



<p>Gerar um token?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez dentro da regra definida.</p>



<p>Criar um pagamento?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez para aquela transação.</p>



<p>Gerar um relatório?<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apenas uma vez para aquele conjunto de parâmetros.</p>



<p>Como identificar chamadas duplicadas?</p>



<p>Antes de tratar duplicidade, precisamos responder uma pergunta fundamental:</p>



<p>Como saber que duas chamadas são, de fato, a mesma operação?</p>



<p>Existem várias estratégias, mas duas são as mais comuns.</p>



<ol class="wp-block-list">
<li>Identidade lógica (baseada no domínio)</li>
</ol>



<p>Aqui, usamos dados do próprio negócio para garantir unicidade.</p>



<p>Exemplos:</p>



<p>E-mail</p>



<p>CPF</p>



<p>Data/hora</p>



<p>Tipo de operação</p>



<p>Estado atual</p>



<p>Exemplo prático:</p>



<p>Um token de confirmação só pode ser gerado a cada 5 minutos para o mesmo e-mail</p>



<p>Se uma nova requisição chega dentro desse intervalo, reutilizamos o token existente</p>



<p>Vantagens:</p>



<p>Simples de entender</p>



<p>Alinhada ao domínio</p>



<p>Pode usar índices únicos no banco</p>



<p>Pouca ou nenhuma mudança no payload</p>



<p>Desvantagens:</p>



<p>Regras precisam estar muito bem alinhadas entre sistemas</p>



<p>Mudanças exigem coordenação entre times</p>



<p>Acoplamento forte ao domínio</p>



<ol start="2" class="wp-block-list">
<li>Chave de idempotência</li>
</ol>



<p>Aqui, o cliente gera um identificador único e envia junto com a requisição.</p>



<p>Essa chave:</p>



<p>Identifica a operação</p>



<p>Independe dos dados de negócio</p>



<p>É armazenada no backend junto com o estado da operação</p>



<p>Fluxo típico:</p>



<p>O cliente gera uma chave</p>



<p>Envia a requisição com essa chave</p>



<p>O backend verifica se ela já existe</p>



<p>Decide se processa, reutiliza ou ignora</p>



<p>Vantagens:</p>



<p>Menos acoplamento ao domínio</p>



<p>Muito comum em APIs públicas e pagamentos</p>



<p>Excelente para retrys automáticos</p>



<p>Cuidados:</p>



<p>A chave precisa ser persistida</p>



<p>O cliente precisa armazená-la corretamente</p>



<p>Exige storage, locks e controle de estado</p>



<p>Quando idempotência é obrigatória?</p>



<p>Idempotência não é “nice to have” em alguns cenários — é requisito de negócio.</p>



<p>Ela é obrigatória quando:</p>



<p>Há efeitos colaterais relevantes</p>



<p>Envolve dinheiro, contratos ou confiança</p>



<p>O sistema é distribuído</p>



<p>Existe mensageria, filas, eventos e consumidores paralelos</p>



<p>Se repetir a operação causa prejuízo ou caos, idempotência é obrigatória.</p>



<p>Quando idempotência é desejável?</p>



<p>Ela é altamente recomendada quando:</p>



<p>Existe retry automático</p>



<p>O sistema lida com redes instáveis</p>



<p>O estado final não pode ser repetido</p>



<p>A operação representa uma transição de estado</p>



<p>Exemplos:</p>



<p>Confirmação de e-mail</p>



<p>Ativação de conta</p>



<p>Finalização de pedido</p>



<p>Cancelamento de assinatura</p>



<p>Quando idempotência pode ser overengineering?</p>



<p>Nem tudo precisa ser idempotente.</p>



<p>Alguns exemplos:</p>



<p>Operações somente leitura</p>



<p>Geração de logs</p>



<p>Métricas</p>



<p>Auditoria</p>



<p>Eventos que devem ser repetidos</p>



<p>Se:</p>



<p>O impacto da duplicação é baixo</p>



<p>O custo de implementação é alto</p>



<p>Não há identidade clara da operação</p>



<p>Talvez o risco seja aceitável.</p>



<p>Arquitetura também é saber onde não colocar complexidade.</p>



<p>E quanto ao REST?</p>



<p>De forma geral:</p>



<p>GET → naturalmente idempotente</p>



<p>PUT → geralmente idempotente</p>



<p>POST → geralmente não idempotente</p>



<p>Mas isso não é regra escrita em pedra.</p>



<p>Tudo depende:</p>



<p>Do domínio</p>



<p>Dos efeitos colaterais</p>



<p>Das garantias que seu sistema precisa oferecer</p>



<p>Conclusão</p>



<p>Chamadas duplicadas não são exceção.<br>Elas são a regra em sistemas reais.</p>



<p>Retry, timeout, instabilidade, falhas intermediárias e comportamento humano fazem parte do jogo.</p>



<p>Nosso papel como arquitetos e desenvolvedores é:</p>



<p>Antecipar esse cenário</p>



<p>Tratar duplicidade corretamente</p>



<p>Proteger o estado do sistema</p>



<p>Evitar efeitos colaterais indesejados</p>



<p>Idempotência é uma decisão de arquitetura, não um detalhe de implementação.</p>



<p>Ela tem custo.<br>Ela tem complexidade.<br>E exatamente por isso não deve ser aplicada cegamente.</p>



<p>Garantir idempotência é garantir que o estado do sistema só muda quando realmente precisa mudar.</p>



<p></p>
<p>The post <a href="https://essencia.dev/ola-mundo/">Idempotência: como lidar corretamente com chamadas duplicadas em APIs e backends</a> appeared first on <a href="https://essencia.dev">essencia.dev</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://essencia.dev/ola-mundo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
