O caso alternativo

Prévia grátis 4 min de leitura

O CAP descreve o que acontece durante uma partição de rede. O PACELC acrescenta a frase que falta ao CAP: e no resto do tempo.

O enunciado

Se houver uma partição (P, de partition), escolha entre disponibilidade (A, availability) e consistência (C, consistency).
Senão (E, else), escolha entre latência (L, latency) e consistência (C).

Daniel Abadi escreveu isso em 2010 e publicou em 2012. O acréscimo é pequeno e decisivo: a primeira metade descreve uma condição rara, e a segunda descreve toda requisição.

Por que o caso do "senão" é o que importa

O curso de nível Sênior "System Design: teorema CAP" mostrou que esta aplicação tem um único nó de banco, então ela nunca teve uma partição e não pode ter.

Mas ela toma decisões do caso "senão" o tempo todo.

# app/queries/admin/stats_query.rb
Rails.cache.fetch("admin/stats/#{resolved}", expires_in: 5.minutes) do
# app/helpers/catalog/course_helper.rb, used by the roadmap's cached collection render
def card_cache_key(course, progress)
  prog = progress[course.id]
  [ course, I18n.locale, current_user.present?, prog&.percentage, prog&.enrolled ]
end

Essas duas linhas fazem escolhas opostas na mesma base de código, e nenhuma delas tem a ver com partições.

As duas escolhas, medidas

A consulta de estatísticas escolhe latência. O expires_in: 5.minutes manda servir um painel que pode ter cinco minutos de atraso em vez de reconstruir, a cada requisição, um resultado de vinte e três campos montado a partir de consultas agregadas. Isso é EL: latência acima de consistência, com um limite declarado.

O cartão de curso escolhe consistência. A chave de cache é [course, I18n.locale, current_user.present?, prog&.percentage, prog&.enrolled], e o Rails transforma o course numa chave que contém o updated_at dele. Editar o curso muda a chave, então o fragmento antigo nunca mais é servido. Isso é EC: consistência acima de latência, paga com a reconstrução do fragmento depois de cada escrita.

flowchart TB
  S["Rails.cache.fetch(..., expires_in: 5.minutes)"] --> S1["EL: latência sobre consistência"]
  S1 --> S2["defasagem limitada: até 5 minutos"]
  C["card_cache_key: [course, I18n.locale, ...]"] --> C1["EC: consistência sobre latência"]
  C1 --> C2["uma escrita muda a chave. nunca velho, sempre reconstruído"]
  S1 --> N["nenhuma tem a ver com uma partição"]
  C1 --> N

A contagem

Nesta aplicação, contado em 28/09/2026:

Escolha Onde Quantidade
EC: a chave inclui o registro Seis caches de fragmento: cartões de curso, cartões do painel, linhas de lição, a lista de parceiros 6
EL: limitada por tempo Admin::StatsQuery, cinco minutos 1
PA ou PC Em lugar nenhum. Existe um nó só 0

São sete decisões do caso "senão" e zero decisões de partição, e é essa proporção que o PACELC existe para mostrar.

O que o CAP não conseguia dizer

O CAP não enxerga nenhuma dessas sete. O teorema descreve um armazenamento de dados distribuído durante uma partição, e um cache de fragmento numa aplicação Rails de nó único não é nem uma coisa nem outra.

Mesmo assim, a decisão tem a mesma estrutura: servir algo que pode estar desatualizado e ser rápido, ou conferir se está atual e ser mais lento. A contribuição do PACELC é dar a isso o nome de mesma troca, para que um time pense num TTL de cache com o cuidado que daria a uma réplica.

Esse novo enquadramento é todo o valor prático, e é por isso que este curso não é uma nota de rodapé do anterior.

A pergunta para levar

Para qualquer leitura, em qualquer sistema, pergunte:

Qual é a idade máxima dos dados em que esta resposta pode se basear, e quanto pagamos para deixá-la atual assim?

Cinco minutos, e vinte e três agregações poupadas. Zero, e um fragmento reconstruído. As duas são respostas. A falha é não ter resposta, e ela é comum porque ninguém pensa num cache como uma decisão de consistência.

Pontos-chave

  • PACELC: se houver partição, escolha disponibilidade ou consistência. Senão, escolha latência ou consistência.
  • A primeira metade descreve uma condição rara, e a segunda descreve toda requisição.
  • O expires_in: 5.minutes é EL com limite declarado. A chave [course, ...] do cartão de curso é EC, paga com a reconstrução depois das escritas.
  • Esta aplicação toma sete decisões do caso "senão" e zero decisões de partição.
  • A pergunta para qualquer leitura: qual é a idade máxima desta resposta, e quanto pagamos por ela estar atual?
Aula 1 de 7 · grátis

Continue com a aula 2

As quatro classes

As quatro classes PA/EL, PA/EC, PC/EL e PC/EC, com exemplos, e por que cada caminho pelo sistema tem sua classe.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...