Pular para o conteúdo

apps/patterns/eventual-consistency

014 · Padrões Fundamentais · ≈ 5 min de estudo

Eventual Consistency

Padrão de consistência distribuída onde réplicas convergem para o mesmo estado após um período de replicação assíncrona.

passos
6
arquivos
8
teste
1
tecnologias
4
Infraestrutura realTypeScriptBunMariaDBDocker
Baixar cartão

Cenário

Conta bancária replicada em dois nós MariaDB (primary e replica), como em um core bancário distribuído entre datacenters. Depósitos e saques vão para o primary imediatamente via UPDATE real. A replica recebe as atualizações por replicação assíncrona nativa do MariaDB (binlog), não por um setTimeout simulando lag. Durante a janela de replicação, leituras da replica podem retornar saldo desatualizado. Eventualmente os dois nós convergem para o mesmo saldo.

Planta

Sequência
7/7
crédito PIX de R$ 500 (UPDATE com delta)1OK — saldo R$ 15002replicação assíncrona nativa via binlog (lag real)lê saldo3R$ 1000 (desatualizado)4envia binlog (UPDATE e INSERT)5lê saldo6R$ 1500 (convergiu)7ClienteMariaDB PrimaryMariaDB Replica
7

7 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Réplicas convergem para o mesmo estado.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    TopologiaDois containers MariaDB — mariadb-primary (server-id=1, binlog habilitado) e mariadb-replica (server-id=2, read-only, aponta para o primary via CHANGE MASTER TO); banco, usuário e schema chegam na réplica pelo próprio binlog

  2. 02

    Escrita só no primaryaccountTransactionApply altera o saldo por delta (balance + ?, comutativo) e grava o lançamento em account_transactions na mesma transação; débito acima do saldo é recusado

  3. 03

    Replicação assíncrona realA réplica aplica os eventos do binlog de forma independente — o lag é de rede + apply, não simulado

  4. 04

    Leitura da réplicaPode devolver saldo desatualizado logo após a escrita; updated_at expõe a idade da cópia

  5. 05

    ConvergênciaaccountConvergenceWait consulta a réplica até o saldo bater com o primary e mede o lag contra o SLO de 1 s

  6. 06

    Trade-offDisponibilidade alta vs. consistência imediata (teorema CAP)

apps/patterns/eventual-consistency

8 arquivos

src/

  • replica_account.tsaccountTransactionApply (escreve só no primary), accountRead (sem FOR UPDATE), accountConvergenceWait (mede o lag real)
  • config_account.tsLê e valida ACCOUNT_PRIMARY_URL e ACCOUNT_REPLICA_URL no boot
  • demo.tsdemoEscreve no primary, lê a réplica logo em seguida e depois aguarda a convergência
  • replica_account.test.tstesteIntegração contra o par primary/réplica real: convergência, fronteira do saldo, réplica somente leitura

sql/

  • 01_schema.sqlschemaTabelas accounts e account_transactions — aplicado só no primary
  • 02_replication_user.sqlschemaUsuário de replicação, aplicado no primary
  • 03_start_replica.sqlschemaCHANGE MASTER TO + START SLAVE, aplicado na réplica

./

  • docker-compose.ymlinfra2 containers mariadb:11 — primary (porta 3306) e réplica (porta 3307)

Executar · com Docker

  1. docker compose up -d# sobe MariaDB
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário

Testes: bun run test.

Requisitos
BunDocker
Sobe junto
MariaDB

Por que se relacionam

Teste rápido

Qual padrão vem antes de Eventual Consistency?

Próximo projeto · Padrões FundamentaisExponential Backoff
Esc

↑ ↓ navegarEnter abrir191 resultados