Todos posts
Notas longas sobre software, sistemas distribuídos e a arte de construir. Publicando uma por semana.
Cache Stampedes São um Problema de Capacidade, Não de Locking
Um lock distribuído em cada cache miss é a correção que a maioria dos posts recorre; nos meus próprios testes é a que transforma um soluço de 400 ms num colapso de fila. Estas são minhas notas tratando stampedes como um orçamento de capacidade upstream — por que 10% de jitter no TTL é um número de cargo cult, o que o XFetch realmente compra, e o critério que uso para decidir quando um lock vale a pena.
Quando uma Zona Cai, Não Deixe seu Cluster se Rebalancear até a Morte
Uma zona de disponibilidade cai e o cluster sobrevive à indisponibilidade — e então se machuca tentando se curar. Estas são minhas anotações da leitura do artigo da Uber sobre OpenSearch resiliente a zonas confrontado com a documentação de allocation awareness: por que o reflexo de re-replicação é o verdadeiro perigo, e como declarar todos os domínios de falha antecipadamente faz um cluster degradar para um amarelo estável em vez de uma tempestade de rebalanceamento.
Read-Your-Writes é um Contrato de Sessão, Não uma Configuração de Banco
Adicionei uma réplica de leitura e, em um dia, usuários reportaram edições que "não salvaram" — elas tinham salvado, mas as leituras correram contra o stream de replicação e perderam. Estas são minhas notas sobre por que read-your-writes é um contrato de sessão em vez de uma configuração de réplica, reproduzido com 50 ms de lag fixo em Go, e as três formas de carregá-lo — roteamento sticky, um token de versão estilo GTID e uma espera de bounded-staleness — comparadas em custo.
Relógios Lógicos Híbridos: Fazendo o Last-Write-Wins Significar a Escrita Mais Recente
O last-write-wins baseado em relógio de parede mantém a escrita do relógio mais rápido, e não a do evento mais recente — e descarta silenciosamente dados causalmente mais novos sob desvio (skew). Estas são minhas notas reconstruindo um Relógio Lógico Híbrido em Go: um timestamp de 64 bits, monotônico e causal, por que seu contador permanece limitado, e quanto isso custa em reinícios por incerteza no estilo do CockroachDB.
Convergência É uma Propriedade da Sua Função de Merge, Não da Rede
Uma vez vi uma tarde inteira de edições offline desaparecer sob um sync last-writer-wins, e a correção não foi uma rede melhor — foi uma função de merge melhor. Estas são minhas notas sobre por que réplicas CRDT convergem: um merge que é comutativo, associativo e idempotente. Reconstruo um OR-Set add-wins mínimo em TypeScript, executo o código e avalio o que a garantia custa em tombstones e memória.
Two-Phase Commit na JVM: O Problema de Bloqueio Que Ninguém Coloca no Diagrama
Eu derrubei de propósito um coordenador de Two-Phase Commit em uma pequena simulação Kotlin para medir por quanto tempo os participantes ficam travados quando o coordenador desaparece entre as fases. O resultado é a parte do 2PC que os diagramas nunca mostram — e a razão pela qual eu modelaria a maior parte das escritas cross-service como uma saga em vez disso.
Descarte Primeiro as Requisições Certas: Load Shedding Baseado em Prioridade sob Sobrecarga
Limites estáticos de RPS descartam o tráfego errado. Concorrência é o que satura um serviço, não a taxa de requisições. A partir das minhas anotações após ler o artigo do InfoQ sobre proteção contra sobrecarga, o post de janeiro da Uber sobre o Cinnamon e a palestra da Netflix no QCon SF sobre load shedding priorizado em nível de serviço, eis por que latência é o sinal de controle correto — e como uma pequena taxonomia de prioridades aliada a um limite adaptativo de concorrência mantém o tráfego mais barato sendo descartado primeiro.
Actor-per-Entity vs Bloqueio Otimista no Postgres: Um Comparativo em Reserva de Assentos
Executei a mesma carga de trabalho de reserva de assentos com hot key de duas formas: Postgres com coluna de versão e retries, e um único actor por assento. O design com actor não escalou melhor — ele moveu o problema difícil do controle de concorrência para a corretude de roteamento e rebalanceamento, e essa troca foi a mais fácil de raciocinar sob hot keys.
Auditando um serviço Scala contra as quatro restrições regenerativas de Chad Fowler
Levei um serviço Scala de processamento de pedidos das minhas anotações pelas quatro restrições regenerativas de Chad Fowler. Duas passaram de graça, duas forçariam um redesign de verdade. Aqui está o que aprendi sobre onde "módulo fracamente acoplado" termina e "componente regenerativo" começa, e quais partes do redesign eu de fato pagaria.
AckWait É um Contrato: Como um Default de 30 Segundos Derrubou Meu Consumer JetStream
Perdi uma noite com um pull consumer NATS JetStream que dobrou seu trabalho em produção. A causa foram três linhas de ConsumerConfig que eu nunca escrevi. Estas são minhas anotações sobre o que o AckWait realmente conta, por que MaxDeliver = -1 é a armadilha silenciosa e o contrato Go de 70 linhas que agora envio em todo consumer JetStream.