<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog de Michel Oliveira</title><link>https://micheloliveira.com/blog/</link><description>Aprofunde-se em arquitetura de software e boas práticas de desenvolvimento.</description><generator>Hugo</generator><language>pt-BR</language><lastBuildDate>Tue, 22 Sep 2026 10:53:07 -0300</lastBuildDate><atom:link href="https://micheloliveira.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Timeouts e Deadlines - Como tratar latência como um orçamento em sistemas distribuídos</title><link>https://micheloliveira.com/blog/timeouts-deadlines-orcamento-de-tempo-sistemas-distribuidos/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/timeouts-deadlines-orcamento-de-tempo-sistemas-distribuidos/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#timeout-e-deadline-não-são-a-mesma-coisa">Timeout e deadline não são a mesma coisa&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-custo-do-trabalho-que-chega-tarde">O custo do trabalho que chega tarde&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#cancelar-a-espera-não-é-cancelar-o-trabalho">Cancelar a espera não é cancelar o trabalho&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#deadline-não-desfaz-efeitos-colaterais">Deadline não desfaz efeitos colaterais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-dividir-um-orçamento-de-latência">Como dividir um orçamento de latência&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#retries-precisam-caber-no-mesmo-orçamento">Retries precisam caber no mesmo orçamento&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#trabalho-síncrono-e-assíncrono-possuem-contratos-diferentes">Trabalho síncrono e assíncrono possuem contratos diferentes&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#observabilidade-descobrir-onde-o-orçamento-desapareceu">Observabilidade: descobrir onde o orçamento desapareceu&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#armadilhas-comuns">Armadilhas comuns&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#usar-o-mesmo-timeout-para-todas-as-dependências">Usar o mesmo timeout para todas as dependências&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#configurar-limites-muito-altos-para-evitar-erros">Configurar limites muito altos para evitar erros&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#configurar-limites-curtos-sem-observar-percentis">Configurar limites curtos sem observar percentis&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#criar-várias-fontes-de-timeout-sem-distinguir-a-causa">Criar várias fontes de timeout sem distinguir a causa&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#receber-o-token-e-não-repassá-lo">Receber o token e não repassá-lo&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#tratar-cancelamento-como-rollback">Tratar cancelamento como rollback&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#um-caminho-prático-para-adoção">Um caminho prático para adoção&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Quando uma integração pode demorar demais, a reação mais comum é adicionar um timeout, então a chamada ao banco recebe 5 segundos, o cliente HTTP recebe 10 e a operação externa ganha mais algumas tentativas antes de falhar. Cada limite parece razoável quando observado isoladamente, embora a requisição do usuário não enxergue essas etapas separadamente e perceba apenas o tempo total.&lt;/p></description></item><item><title>Abstrações são úteis, até deixarem de ser - Os custos implícitos nas implementações de software</title><link>https://micheloliveira.com/blog/abstracoes-sao-uteis-ate-deixarem-de-ser/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/abstracoes-sao-uteis-ate-deixarem-de-ser/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#quando-uma-operação-simples-esconde-trabalho-demais">Quando uma operação simples esconde trabalho demais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#uma-chamada-remota-continua-sendo-uma-chamada-remota">Uma chamada remota continua sendo uma chamada remota&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#abstrações-internas-também-precisam-justificar-seu-custo">Abstrações internas também precisam justificar seu custo&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#esconder-não-é-o-mesmo-que-tornar-invisível">Esconder não é o mesmo que tornar invisível&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#trade-offs-quando-a-abstração-vale-o-custo">Trade-offs: quando a abstração vale o custo&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#quando-ela-deixa-de-valer-o-custo">Quando ela deixa de valer o custo&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Boa parte do software que escrevemos depende de detalhes que não queremos carregar o tempo inteiro enquanto desenvolvemos. Quando salvamos um arquivo não pensamos em como os dados serão distribuídos no disco, quando consultamos um banco normalmente não queremos controlar como cada linha será lida e transformada em memória e, quando usamos uma biblioteca, esperamos que ela resolva uma parte do problema sem nos obrigar a conhecer toda a implementação que existe por baixo.&lt;/p></description></item><item><title>Reduzindo mais de 90% da latência na Rinha de Backend 2026 executando FAISS diretamente dentro das APIs .NET</title><link>https://micheloliveira.com/blog/reduzindo-latencia-rinha-de-backend-2026-faiss-direto-nas-apis-dotnet/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/reduzindo-latencia-rinha-de-backend-2026-faiss-direto-nas-apis-dotnet/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#repositórios">Repositórios&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#por-que-o-python-virou-gargalo">Por que o Python virou gargalo&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#a-primeira-arquitetura">A primeira arquitetura&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-levou-à-mudança">O que levou à mudança&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#a-nova-arquitetura">A nova arquitetura&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-deixa-de-existir">O que deixa de existir&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#trade-offs">Trade-offs&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#resultados-oficiais">Resultados oficiais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#resultados-locais">Resultados locais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#próximos-passos">Próximos passos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Na primeira versão da minha solução para a Rinha de Backend 2026, a busca vetorial rodava em um serviço separado em Python utilizando FAISS (Facebook AI Similarity Search), enquanto as APIs HTTP eram implementadas em .NET Native AOT.&lt;/p></description></item><item><title>Desafio de Performance - Rinha de Backend 2026 - Insights da Minha Versão em C# AOT + Similarity Search em Python com FAISS</title><link>https://micheloliveira.com/blog/desafio-performance-rinha-backend-2026-insights-csharp-faiss/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/desafio-performance-rinha-backend-2026-insights-csharp-faiss/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#repositórios">Repositórios&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-objetivo-da-solução">O objetivo da solução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-é-busca-vetorial-de-fato">O que é busca vetorial de fato?&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#ia-e-uso-de-vetores">IA e uso de vetores&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#exemplos-de-uso">Exemplos de uso&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#por-que-o-gargalo-fica-concentrado-na-busca-vetorial">Por que o gargalo fica concentrado na busca vetorial&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-a-consulta-deve-funcionar-na-rinha-2026">Como a consulta deve funcionar na Rinha 2026&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#onde-a-escala-torna-a-pesquisa-por-força-bruta-inviável">Onde a escala torna a pesquisa por força bruta inviável&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-problema-de-memória-é-ainda-pior">O problema de memória é ainda pior&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#faiss---facebook-ai-similarity-search">FAISS - Facebook AI Similarity Search&lt;/a>
 &lt;ul>
 &lt;li>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#redução-de-comparações-com-ivf">Redução de comparações com IVF&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#testes-realizados">Testes realizados&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#postgresql--pgvector-com-hnsw--ivf-e-mariadb-vector-hnsw">PostgreSQL + pgvector (com HNSW / IVF) e MariaDB Vector (HNSW)&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#bibliotecas-de-índice-vetorial-em-net">Bibliotecas de índice vetorial em .NET&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#bancos-vetoriais-dedicados">Bancos vetoriais dedicados&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#a-solução-final-faiss-com-ivf--quantização-fp16">A solução final: FAISS com IVF + quantização FP16&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#redução-de-memória">Redução de memória&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#por-que-os-parâmetros-escolhidos-são-críticos">Por que os parâmetros escolhidos são críticos&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#nlist--4096">&lt;code>nlist = 4096&lt;/code>&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#nprobe--16">&lt;code>nprobe = 16&lt;/code>&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#como-a-arquitetura-foi-organizada">Como a arquitetura foi organizada&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#1-load-balancer">1. Load balancer&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#2-duas-apis-em-net-native-aot">2. Duas APIs em .NET Native AOT&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#3-serviço-dedicado-de-busca-vetorial-em-python">3. Serviço dedicado de busca vetorial em Python&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#detalhe-importante-o-índice-é-pré-construído">Detalhe importante: o índice é pré-construído&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#resultado-local-k6">Resultado local (K6)&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#resultado-oficial-no-github">Resultado oficial no GitHub&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>A edição 2026 da Rinha de Backend alterou profundamente o tipo de problema que precisava ser resolvido. Nas edições anteriores, o centro da discussão normalmente girava em torno de concorrência, coordenação entre processos, filas, cache, persistência e throughput HTTP sob carga. Eram desafios clássicos de sistemas distribuídos e engenharia de backend: como aceitar muitas requisições, como evitar contenção, como reduzir latência em operações de I/O e como manter estabilidade quando a pressão de tráfego aumentava.&lt;/p></description></item><item><title>Como a Microsoft otimiza automaticamente milhões de bancos de dados</title><link>https://micheloliveira.com/blog/como-a-microsoft-otimiza-automaticamente-milhoes-de-databases/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/como-a-microsoft-otimiza-automaticamente-milhoes-de-databases/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-automatic-tuning-da-microsoft">O Automatic Tuning da Microsoft&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#arquitetura-e-funcionamento-interno">Arquitetura e funcionamento interno&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#ciclo-de-decisão-e-segurança">Ciclo de decisão e segurança&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#criação-e-remoção-automática-de-índices">Criação e remoção automática de índices&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#correção-no-plano-de-execução-das-queries">Correção no plano de execução das queries&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#compactação-automática-de-índices-2026">Compactação automática de índices (2026)&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#funcionamento-da-compactação">Funcionamento da compactação&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#impacto-técnico">Impacto técnico&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#papel-do-dba-e-da-aplicação">Papel do DBA e da aplicação&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#fine-tuning-manual-está-perdendo-espaço">Fine tuning manual está perdendo espaço&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-novo-equilíbrio">O novo equilíbrio&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-dba-continua-agregando-valor">O DBA continua agregando valor&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#trade-offs">Trade-offs&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#minha-experiência-com-o-automatic-tuning">Minha experiência com o Automatic Tuning&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#comparação-com-outras-soluções">Comparação com outras soluções&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Durante muito tempo, tuning de banco de dados foi uma atividade essencialmente manual: analisar consultas, ajustar índices, acompanhar fragmentação e manter rotinas periódicas de manutenção.&lt;/p></description></item><item><title>O Acoplamento Oculto: Como dependências sutis quebram a manutenção de um software</title><link>https://micheloliveira.com/blog/o-acoplamento-oculto-como-dependencias-sutis-quebram-a-manutencao-de-um-software/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/o-acoplamento-oculto-como-dependencias-sutis-quebram-a-manutencao-de-um-software/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#1-fundamentos-o-que-é-acoplamento-e-por-que-ele-é-inevitável">1. Fundamentos: O que é acoplamento e por que ele é inevitável&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#2-formas-de-acoplamento-oculto-no-mundo-real">2. Formas de acoplamento oculto no mundo real&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#3-efeitos-colaterais-do-acoplamento-oculto">3. Efeitos colaterais do acoplamento oculto&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#4-reflection-quando-a-implementação-revela-o-acoplamento-oculto">4. Reflection: Quando a implementação revela o acoplamento oculto&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#5-diagnóstico-como-detectar-o-invisível">5. Diagnóstico: Como detectar o invisível&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#6-estratégias-para-reduzir-e-controlar-o-acoplamento">6. Estratégias para reduzir e controlar o acoplamento&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#7-paralelo-com-java-e-spring">7. Paralelo com Java e Spring&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#8-casos-reais-quando-o-invisível-quebrou-o-sistema">8. Casos reais: Quando o invisível quebrou o sistema&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#9-arquitetura-evolutiva-e-o-princípio-da-visibilidade">9. Arquitetura evolutiva e o princípio da visibilidade&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Em engenharia de software, há um inimigo silencioso que não lança exceções, não aparece em logs e não é detectado por testes unitários: o &lt;strong>acoplamento oculto&lt;/strong>. Ele se manifesta em dependências invisíveis entre componentes que, com o tempo, tornam o sistema imprevisível, rígido e difícil de evoluir.&lt;/p></description></item><item><title>Memory Leak: Quando um vazamento de memória pode derrubar a sua aplicação</title><link>https://micheloliveira.com/blog/memory-leak-quando-um-vazamento-de-memoria-pode-derrubar-a-sua-aplicacao/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/memory-leak-quando-um-vazamento-de-memoria-pode-derrubar-a-sua-aplicacao/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#fundamentos-do-gerenciamento-de-memória-no-net">Fundamentos do Gerenciamento de Memória no .NET&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#não-interfira-no-garbage-collector">Não Interfira no Garbage Collector&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-um-memory-leak-surge">Como um Memory Leak Surge&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#exemplos-de-memory-leak-em-net">Exemplos de Memory Leak em .NET&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#memory-leak-em-código-unsafe">Memory Leak em Código Unsafe&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#memory-leak-com-código-não-gerenciado">Memory Leak com Código Não Gerenciado&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#caso-real-getmetadataworkspace-do-entity-framework">Caso Real: GetMetadataWorkspace do Entity Framework&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#memory-leak-também-em-outras-linguagens">Memory Leak Também em Outras Linguagens&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#diagnóstico-e-ferramentas-para-net">Diagnóstico e Ferramentas para .NET&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#boas-práticas-para-evitar-vazamentos">Boas Práticas para Evitar Vazamentos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Vazamentos de memória são problemas silenciosos e cumulativos em sistemas complexos. Eles consomem memória gradualmente, degradando performance e eventualmente causando falhas críticas.&lt;/p></description></item><item><title>Streams: Quando e por que usar para processamento eficiente de dados</title><link>https://micheloliveira.com/blog/streams-quando-e-por-que-usar-para-processamento-eficiente-de-dados/</link><pubDate>Fri, 03 Oct 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/streams-quando-e-por-que-usar-para-processamento-eficiente-de-dados/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#paradigma-tradicional-vs-streaming">Paradigma Tradicional vs Streaming&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#arquitetura-visão-conceitual">Arquitetura: Visão conceitual&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-conceito-de-buffer">O conceito de buffer&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#exemplo-teórico-lendo-um-arquivo-de-10gb-em-net-c">Exemplo Teórico: Lendo um arquivo de 10GB em .NET, C#&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#abordagem-sem-streaming">Abordagem sem streaming&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#abordagem-com-streaming-e-buffer">Abordagem com streaming e buffer&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#visualizando-a-diferença">Visualizando a diferença&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#streaming-em-http-grpc-e-outros-dados-contínuos">Streaming em HTTP, gRPC e outros dados contínuos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#impactos-na-performance-e-garbage-collection">Impactos na Performance e Garbage Collection&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#onde-ainda-vejo-memória-sendo-estourada">Onde ainda vejo memória sendo estourada&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#trade-offs-stream-vs-não-stream">Trade-offs: Stream vs Não Stream&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#quando-usar-streams">Quando usar Streams&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#aplicações-no-mundo-real">Aplicações no mundo real&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Vivemos em uma era de excesso de informação. Logs que crescem a cada segundo, bancos de dados de terabytes, vídeos transmitidos em tempo real. Nesse cenário, surge a pergunta:&lt;/p></description></item><item><title>Microsoft traz Trusted Publishing ao NuGet: Como aplicar e proteger pacotes com exemplo real no ReactiveLock</title><link>https://micheloliveira.com/blog/microsoft-trusted-publishing-nuget-como-aplicar-proteger-pacotes-reactivelock/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/microsoft-trusted-publishing-nuget-como-aplicar-proteger-pacotes-reactivelock/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#por-que-é-importante">Por que é importante&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-aplicar">Como aplicar&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-o-trusted-publishing-funciona-no-nuget">Como o Trusted Publishing funciona no NuGet&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#exemplo-real-reactivelock">Exemplo real: ReactiveLock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>A Microsoft lançou recentemente o &lt;strong>Trusted Publishing&lt;/strong> no NuGet, eliminando a necessidade de tokens de API permanentes (ou de alta duração) para publicar pacotes .NET. Este recurso é essencial para &lt;strong>proteger a cadeia de suprimentos de pacotes&lt;/strong> contra ataques (&lt;em>supply chain attacks&lt;/em>), garantindo que apenas workflows confiáveis possam publicar versões oficiais.&lt;/p></description></item><item><title>O Custo Invisível do Serverless: Quando a arquitetura 'sem servidor' tem preço</title><link>https://micheloliveira.com/blog/o-custo-invisivel-do-serverless-quando-a-arquitetura-tem-preco/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/o-custo-invisivel-do-serverless-quando-a-arquitetura-tem-preco/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#escalabilidade-automática-nem-sempre-é-previsível">Escalabilidade automática nem sempre é previsível&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#custo-de-execução-vs-custo-de-operação">Custo de execução vs. custo de operação&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#cold-starts-e-impacto-na-experiência-do-usuário">Cold starts e impacto na experiência do usuário&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#vendor-lock-in-dependência-invisível">Vendor lock-in: dependência invisível&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#complexidade-operacional-oculta">Complexidade operacional oculta&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#boas-práticas-para-reduzir-custos-ocultos">Boas práticas para reduzir custos ocultos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>O modelo &lt;strong>serverless&lt;/strong> tem sido frequentemente promovido como uma solução mágica para reduzir custos e simplificar operações.&lt;/p>
&lt;p>A narrativa dominante é: &lt;em>“não se preocupe mais com servidores, pague apenas pelo que usar e escale automaticamente”&lt;/em>.&lt;/p></description></item><item><title>Self-Hosting é para o seu projeto? Pilares da hospedagem de aplicações, IaaS, PaaS, Kubernetes e Serverless</title><link>https://micheloliveira.com/blog/self-hosting-para-seu-projeto-pilares-hospedagem-aplicacoes/</link><pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/self-hosting-para-seu-projeto-pilares-hospedagem-aplicacoes/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conceitos">Conceitos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#modelos-de-hospedagem--execução">Modelos de hospedagem / execução&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#self-hosting--iaas">Self-Hosting / IaaS&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#plataformas-self-hosted">Plataformas Self-Hosted&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#paas">PaaS&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#managed-kubernetes">Managed Kubernetes&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#serverless--faas">Serverless / FaaS&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#tradeoffs-e-decisão-estratégica">Tradeoffs e decisão estratégica&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#escalabilidade-por-modelo-de-hospedagem">Escalabilidade por modelo de hospedagem&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#insights">Insights&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#kubernetes-self-hosted-na-hetzner">Kubernetes Self-Hosted na Hetzner&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#diagrama-de-arquitetura-k8s-autoscalável-na-hetzner">Diagrama de arquitetura K8s autoscalável na Hetzner&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#coolify--caprover--dokku-em-vms-iaas-self-hosted">Coolify / CapRover / Dokku em VMs IaaS (Self-Hosted)&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#kubernetes-gerenciado-managed-kubernetes">Kubernetes Gerenciado (Managed Kubernetes)&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#nível-de-serviço-ou-sla-service-level-agreement">Nível de Serviço ou SLA (Service Level Agreement)&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#dependência-e-especialização-do-time">Dependência e Especialização do Time&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#suporte-do-cloud-provider-x-nível-de-serviço">Suporte do Cloud Provider x Nível de Serviço&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#níveis-de-responsabilidade-time-x-provedor-de-infraestrutura">Níveis de responsabilidade: Time x Provedor de Infraestrutura&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#checklist-de-decisão">Checklist de decisão&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#recomendações">Recomendações&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#e-o-banco-de-dados-gerenciado-ou-não">E o Banco de Dados: Gerenciado ou Não?&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Decidir entre self-hosting, PaaS ou serverless não é apenas uma escolha de custo. Cada modelo impacta diretamente confiabilidade, velocidade de entrega, escalabilidade, segurança e necessidade de especialização da equipe. Para os times, a decisão deve levar em conta tradeoffs técnicos, operacionais e financeiros.&lt;/p></description></item><item><title>Desafio Rinha de Backend 2025: Análise técnica detalhada e o uso da biblioteca de lock ReactiveLock</title><link>https://micheloliveira.com/blog/desafio-rinha-backend-2025-analise-tecnica-detalhada-biblioteca-reactivelock/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/desafio-rinha-backend-2025-analise-tecnica-detalhada-biblioteca-reactivelock/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-desafio">O desafio&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#arquitetura-mínima-da-api">Arquitetura mínima da API&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#solução-com-redis">Solução com Redis&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#problemas-enfrentados">Problemas enfrentados&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#estratégias-adotadas-pelos-participantes">Estratégias adotadas pelos participantes&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#introdução-ao-reactivelock">Introdução ao ReactiveLock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#estratégia-de-espera-e-partição-de-locks">Estratégia de espera e partição de locks&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#fluxo-detalhado-de-processamento">Fluxo detalhado de processamento&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#estratégia-de-fallback-em-instabilidade">Estratégia de fallback em instabilidade&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#benefícios-observados">Benefícios observados&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#riscos-potenciais">Riscos potenciais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#minhas-posições">Minhas posições&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#considerações-finais">Considerações finais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>O desafio da &lt;strong>&lt;a href="https://micheloliveira.com/blog/desafio-performance-rinha-backend-2025-insights-csharp-postgresql-redis/">Rinha de Backend 2025&lt;/a>&lt;/strong> foi um exercício de engenharia em condições de alta concorrência, limitação de recursos (350MB de memória, 1.5 CPUs totais), e instabilidade nos serviços.&lt;/p></description></item><item><title>PCI DSS - Porque você deveria conhecer antes de desenvolver qualquer aplicação com transações financeiras</title><link>https://micheloliveira.com/blog/pci-dss-porque-voce-deveria-conhecer-antes-de-desenvolver/</link><pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/pci-dss-porque-voce-deveria-conhecer-antes-de-desenvolver/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-é-pci-dss">O que é PCI DSS?&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#pci-dss-e-o-nível-de-exigência">PCI DSS e o nível de exigência&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#relação-entre-pci-dss-e-lgpd">Relação entre PCI DSS e LGPD&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#uso-apenas-pix-e-boleto-preciso-me-preocupar-com-pci-dss">Uso apenas PIX e boleto, preciso me preocupar com PCI DSS?&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#os-dados-do-titular-do-cartão---chd-cardholder-data">Os dados do titular do cartão - CHD (Cardholder Data)&lt;/a>
 &lt;ul>
 &lt;li>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#os-requisitos-do-pci-dss">Os requisitos do PCI DSS&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-impacto-para-desenvolvedores">O impacto para desenvolvedores&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#gateways-brasileiros-com-apis-pci-dss-compliant">Gateways brasileiros com APIs PCI DSS compliant&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#checklist-prático-dos-itens-que-os-times-de-desenvolvimento-devem-garantir">Checklist prático dos itens que os times de desenvolvimento devem garantir&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências-oficiais">Referências oficiais&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Se você já trabalhou em um sistema que processa pagamentos (cartão de crédito, débito, wallets, etc.), provavelmente já esbarrou em termos como PCI DSS, compliance PCI e tokenização.&lt;/p></description></item><item><title>ReactiveLock – Um case pronto para produção da Rinha de Backend 2025</title><link>https://micheloliveira.com/blog/reactivelock-um-case-pronto-para-producao-biblioteca-nuget/</link><pubDate>Tue, 02 Sep 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/reactivelock-um-case-pronto-para-producao-biblioteca-nuget/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-é-o-reactivelock">O que é o ReactiveLock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#comparação-com-outras-bibliotecas-de-lock">Comparação com Outras Bibliotecas de Lock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#benefícios-da-biblioteca">Benefícios da Biblioteca&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#componentes-principais">Componentes Principais&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#arquitetura-base">Arquitetura Base&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#fluxo-básico-de-lock">Fluxo Básico de Lock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#detalhe-do-fluxo-básico">Detalhe do Fluxo Básico&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#uso-na-rinha-de-backend-2025-e-case-de-produção">Uso na Rinha de Backend 2025 e Case de Produção&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#mitigando-o-teorema-cap">Mitigando o Teorema CAP&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-integrar-o-reactivelock">Como Integrar o ReactiveLock&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Participei da &lt;strong>&lt;a href="https://micheloliveira.com/blog/desafio-performance-rinha-backend-2025-insights-csharp-postgresql-redis/">Rinha de Backend 2025&lt;/a>&lt;/strong>, um desafio de alta performance para sistemas distribuídos, enviando diversas versões para avaliação de desempenho e consistência, incluindo:&lt;/p></description></item><item><title>O Teorema CAP na Prática: Lições da Rinha de Backend 2025</title><link>https://micheloliveira.com/blog/teorema-cap-na-pratica-licoes-rinha-de-backend-2025/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/teorema-cap-na-pratica-licoes-rinha-de-backend-2025/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#o-que-o-teorema-cap-realmente-significa">O que o Teorema CAP realmente significa&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#como-isso-aparece-na-rinha">Como isso aparece na Rinha&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#estratégias-observadas-na-prática">Estratégias observadas na prática&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-aprendemos-com-isso">O que aprendemos com isso&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;p>Durante a &lt;a href="https://micheloliveira.com/blog/desafio-performance-rinha-backend-2025-insights-csharp-postgresql-redis/">Rinha de Backend 2025&lt;/a>, os participantes enfrentaram um desafio que ia além da performance bruta. O objetivo era construir sistemas distribuídos rápidos, confiáveis e resilientes diante de falhas. A proposta parecia simples: processar pagamentos entre dois serviços que poderiam ficar instáveis. No entanto, à medida que o sistema era colocado sob carga, surgia uma questão importante: o que acontece quando partes do sistema deixam de se comunicar e / ou estão fora de sincronia?&lt;/p></description></item><item><title>Desafio de Performance - Rinha de Backend 2025 - Insights da Minha Versão em C# + PostgreSQL + Redis</title><link>https://micheloliveira.com/blog/desafio-performance-rinha-backend-2025-insights-csharp-postgresql-redis/</link><pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/desafio-performance-rinha-backend-2025-insights-csharp-postgresql-redis/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#repositórios">Repositórios&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#insights-principais">Insights principais&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#1-coordenação-reativa-entre-instâncias-com-reactivelock---rastreamento-de-estado-e-sincronização-distribuída-via-redis">1. Coordenação reativa entre instâncias com ReactiveLock - rastreamento de estado e sincronização distribuída via Redis&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#2-performance-real-com-execução-nativa-aot-no-net-9">2. Performance real com execução nativa AOT no .NET 9&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#3-throughput-otimizado-com-bulk-insert-no-postgresql">3. Throughput otimizado com bulk insert no PostgreSQL&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#4-balanceamento-de-carga-real-com-enfileiramento-via-redis---somente-distribuição-de-tráfego-por-round-robin-não-é-adequado-para-cenários-dinâmicos">4. Balanceamento de carga real com enfileiramento via Redis - somente distribuição de tráfego por round robin não é adequado para cenários dinâmicos&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#5-separação-entre-enfileiramento-e-processamento-assíncrono-para-alta-escalabilidade-e-responsividade">5. Separação entre enfileiramento e processamento assíncrono para alta escalabilidade e responsividade&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Este artigo traz uma análise dos principais insights técnicos que tive ao construir minha solução para a Rinha de Backend 2025. O foco é mostrar decisões que impactaram diretamente no desempenho, estabilidade e integridade do sistema, especialmente considerando as restrições severas do desafio.&lt;/p></description></item><item><title>Web Application Firewall nunca deveria ser desconsiderado em aplicações públicas</title><link>https://micheloliveira.com/blog/web-application-firewall-nunca-deveria-ser-desconsiderado/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/web-application-firewall-nunca-deveria-ser-desconsiderado/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#1-ameaças-comuns-a-aplicações-web">1. Ameaças comuns a aplicações web&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#2-o-papel-do-waf-na-segurança">2. O papel do WAF na segurança&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#3-cenário-sem-waf-riscos-e-vetores-de-ataque">3. Cenário sem WAF: riscos e vetores de ataque&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#4-custo-em-nuvem-e-proteção-contra-ddos">4. Custo em nuvem e proteção contra DDoS&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#5-boas-práticas-de-implementação-de-waf">5. Boas práticas de implementação de WAF&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Em um cenário de ameaças cibernéticas cada vez mais sofisticadas, o Web Application Firewall (WAF) é uma camada essencial de proteção pois ele analisa o tráfego HTTP antes que alcance o servidor, bloqueando padrões maliciosos e comportamentos suspeitos. Mesmo com frameworks modernos, falhas em bibliotecas, configurações ou atualizações podem expor vulnerabilidades e ignorar o WAF é subestimar o risco real. Neste artigo, exploramos como essa barreira reforça a segurança e protege aplicações com eficiência.&lt;/p></description></item><item><title>Arquitetura de Software que Entrega: O Impacto Real nas Equipes de Desenvolvimento</title><link>https://micheloliveira.com/blog/arquitetura-de-software-que-entrega-impacto-real-equipes-desenvolvimento/</link><pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/arquitetura-de-software-que-entrega-impacto-real-equipes-desenvolvimento/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#arquitetura-como-facilitadora-das-entregas">Arquitetura como facilitadora das entregas&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#benefícios-de-padrões-e-planejamento-arquitetural">Benefícios de padrões e planejamento arquitetural&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#colaboração-entre-arquitetos-e-equipes">Colaboração entre arquitetos e equipes&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#práticas-recomendadas-para-arquitetura-ágil">Práticas recomendadas para arquitetura ágil&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>A arquitetura de software é o “esqueleto” de um sistema, definindo os componentes, padrões e acordos que orientam o desenvolvimento. Em equipes ágeis, uma arquitetura bem planejada facilita entregas rápidas e seguras, enquanto decisões arquiteturais inadequadas podem criar gargalos e atritos que atrasam o time. Em outras palavras, uma arquitetura bem projetada impulsiona a agilidade e permite mudanças iterativas com baixo risco.&lt;/p></description></item><item><title>Backpressure e Controle de Fluxo em Sistemas Reativos</title><link>https://micheloliveira.com/blog/backpressure-controle-de-fluxo-sistemas-reativos/</link><pubDate>Thu, 26 Jun 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/backpressure-controle-de-fluxo-sistemas-reativos/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-problema-da-assimetria-de-velocidade">O Problema da Assimetria de Velocidade&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-que-é-backpressure">O Que é Backpressure?&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#estratégias-comuns">Estratégias Comuns&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#modelos-reativos-e-controle-de-fluxo">Modelos Reativos e Controle de Fluxo&lt;/a>
 &lt;ul>
 &lt;li>&lt;a href="#publisher-e-subscriber">Publisher e Subscriber&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#fluxo-sob-demanda">Fluxo sob Demanda&lt;/a>&lt;/li>
 &lt;/ul>
 &lt;/li>
 &lt;li>&lt;a href="#benefícios-do-backpressure">Benefícios do Backpressure&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#considerações-de-implementação">Considerações de Implementação&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Sistemas modernos precisam lidar com fluxos contínuos de dados e picos de carga cada vez mais frequentes. Em arquiteturas orientadas a eventos, &lt;strong>o controle de fluxo&lt;/strong> se torna um fator crítico para garantir que o sistema não entre em colapso sob pressão. É nesse contexto que surgem conceitos como &lt;strong>backpressure&lt;/strong>, que definem como produtores e consumidores negociam a taxa de entrega de dados.&lt;/p></description></item><item><title>Retries Distribuídos: Evitando o Thundering Herd</title><link>https://micheloliveira.com/blog/retries-distribuidos-evitando-thundering-herd/</link><pubDate>Sat, 21 Jun 2025 00:00:00 +0000</pubDate><guid>https://micheloliveira.com/blog/retries-distribuidos-evitando-thundering-herd/</guid><description>&lt;div class="bg-gray-50 p-4 rounded-lg mb-8">
 &lt;span class="text-xl font-semibold mb-4">Sumário&lt;/span>
 &lt;details class="group">
 &lt;summary class="cursor-pointer text-sm text-gray-600 hover:text-gray-800 select-none">
 Mostrar/Ocultar
 &lt;/summary>
 &lt;div class="mt-2 text-sm leading-snug text-gray-700">
 &lt;nav id="TableOfContents">
 &lt;ul>
 &lt;li>&lt;a href="#introdução">Introdução&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#o-desafio-do-thundering-herd">O Desafio do “Thundering Herd”&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conceito-de-retry-distribuído">Conceito de Retry Distribuído&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#modelagem-de-chave-e-valor">Modelagem de Chave e Valor&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#fluxo-de-retries-coordenados">Fluxo de Retries Coordenados&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#benefícios">Benefícios&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#cuidados-operacionais">Cuidados Operacionais&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#conclusão">Conclusão&lt;/a>&lt;/li>
 &lt;li>&lt;a href="#referências">Referências&lt;/a>&lt;/li>
 &lt;/ul>
&lt;/nav>
 &lt;/div>
 &lt;/details>
&lt;/div>
&lt;h2 id="introdução">Introdução&lt;/h2>
&lt;p>Em sistemas distribuídos, é comum que várias instâncias de um mesmo serviço detectem simultaneamente uma falha em um endpoint externo e disparem &lt;strong>retries&lt;/strong> ao mesmo tempo. Esse comportamento, conhecido como &lt;em>thundering herd&lt;/em>, pode causar ainda mais sobrecarga no serviço alvo, gerando latências adicionais ou até quedas totais. Para superar esse desafio, adotamos padrões de &lt;strong>retries distribuídos&lt;/strong>, nos quais um armazenamento compartilhado (por exemplo, Redis) atua como ponto único de verdade para coordenar quando cada instância pode tentar novamente.&lt;/p></description></item></channel></rss>