O caso alternativo
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?
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.