% Showcase — a real mini-chapter that exercises every Spectra element.
% Compile FROM THE REPO ROOT: latexmk examples/showcase.tex
\documentclass{spectra}
\begin{document}
% Cover: bundled public-domain painting as the background (see CREDITS.md).
\capebg{assets/gradients/cover.jpg}
\makecape{Sistemas Distribuídos}{Anotações de estudo · 2026/1}{Seu Nome}
\tableofcontents
\clearpage
\section{Tempo e ordem}
Num sistema distribuído não existe um relógio global confiável. Cada máquina tem seu
próprio relógio, e eles derivam entre si. Por isso não podemos ordenar eventos de
máquinas diferentes só comparando \emph{timestamps} de parede: dois eventos com a
mesma hora podem ter acontecido em ordens distintas do ponto de vista causal.
\spcmargin[Causalidade]{Se um evento pode ter influenciado outro, dizemos que há uma
relação \emph{happens-before}.}
A saída é abandonar o tempo físico como fonte de verdade e trabalhar com \emph{ordem
causal}. Relógios lógicos capturam ``o evento A aconteceu antes do evento B'' sem
precisar que os relógios estejam sincronizados.
\begin{definition}[Relógio de Lamport]
Um contador inteiro por processo. Antes de cada evento local, incrementa. Ao enviar
uma mensagem, anexa o contador; ao receber, faz $C \leftarrow \max(C, C_{msg}) + 1$.
Garante que se $A$ \emph{happens-before} $B$, então $C(A) < C(B)$.
\end{definition}
\begin{example}[Ordenando duas mensagens]
Processo~1 envia $m_1$ com carimbo $3$; processo~2, que estava em $1$, recebe e passa a
$\max(1,3)+1 = 4$. Qualquer evento seguinte em~2 terá carimbo maior que o envio de $m_1$.
\end{example}
\begin{warning}
A recíproca não vale: $C(A) < C(B)$ \textbf{não} implica que $A$ aconteceu antes de $B$.
Relógios de Lamport dão uma ordem total consistente, mas não detectam concorrência.
Para isso são precisos \emph{vector clocks}.
\end{warning}
\herobox[assets/gradients/hero.jpg]{Ordem sem relógio}{relógios lógicos capturam causalidade, não tempo de parede}
\section{Consistência}
Quando os dados estão replicados, ``consistência'' vira um espectro de garantias, da
mais forte (e mais cara) à mais fraca (e mais disponível). Escolher o modelo é decidir
quanto de anomalia a aplicação tolera em troca de latência e disponibilidade.
\begin{spctable}{colspec={l X[l] c}}
Modelo & O que garante & Custo \\
Linearizável & Toda leitura vê a escrita mais recente, como se fosse um só nó & Alto \\
Sequencial & Uma ordem global respeitada por todos, não necessariamente em tempo real & Médio \\
Causal & Escritas causalmente relacionadas são vistas na mesma ordem & Baixo \\
Eventual & As réplicas convergem se as escritas pararem & Mínimo \\
\end{spctable}
\begin{keyidea}
Consistência mais forte custa disponibilidade sob partição de rede. O teorema CAP
formaliza esse trade-off: sob partição, escolha entre responder (AP) ou ficar
consistente (CP).
\end{keyidea}
\begin{tip}
Comece pela consistência eventual e só endureça as garantias onde a aplicação
realmente doer. Endurecer cedo demais paga latência que talvez nunca fosse necessária.
\end{tip}
\begin{quotebox}[— Leslie Lamport]
Um sistema distribuído é aquele em que a falha de um computador que você nem sabia que
existia pode tornar o seu inútil.
\end{quotebox}
\section{Na prática}
O relógio de Lamport cabe em poucas linhas. O cuidado está em atualizar o contador em
todo ponto de envio e recebimento, sem esquecer nenhum caminho.
\begin{codebox}{python}{lamport.py}
class LamportClock:
def __init__(self):
self.t = 0
def tick(self):
self.t += 1
return self.t
def on_receive(self, received):
self.t = max(self.t, received) + 1
return self.t
\end{codebox}
\begin{checklist}
\item Ler o paper de Lamport (1978)
\item Implementar o relógio lógico
\item[\spctodo] Escrever teste de reentrega de mensagem
\item[\spctodo] Medir latência p99 sob partição
\end{checklist}
\begin{summary}
Sem relógio global, ordene por causalidade. Relógios de Lamport dão ordem total mas não
detectam concorrência. Consistência é um espectro; escolha o modelo pelo trade-off entre
garantia, latência e disponibilidade sob partição.
\end{summary}
\end{document}

PDF Preview
Create an account to compile and preview