Design clássico · Sênior
Serviço de e-mail distribuído (Gmail)
Projeto de entrevista clássico. Pontos centrais: entrega de blobs e vídeo e SMTP/IMAP.
Resposta curta
Projeto de entrevista clássico. Pontos centrais: entrega de blobs e vídeo e SMTP/IMAP. Um serviço de e-mail recebe mensagens de outros domínios, guarda cada uma na caixa certa e deixa a pessoa lê-las. Entre servidores a mensagem trafega por SMTP; o cliente acessa as mensagens guardadas no servidor por IMAP.
01 · CONTEXTO
O que um serviço de e-mail precisa fazer
Um serviço de e-mail recebe mensagens de outros domínios, guarda cada uma na caixa certa e deixa a pessoa lê-las. Entre servidores a mensagem trafega por SMTP; o cliente acessa as mensagens guardadas no servidor por IMAP.
Este caso se apoia só em fontes públicas: os padrões do IETF, a documentação do servidor Dovecot e a do filtro Apache SpamAssassin.
Uma mensagem raramente vai direto do remetente ao destino final. Os hosts intermediários são normalmente descobertos pelo registro MX do DNS, e um servidor relay que aceita a tarefa vira ele próprio um cliente SMTP e abre o canal até o próximo servidor.
02 · ENTREGA PELA INTERNET
SMTP, DNS e filas de retentativa
O ponto crítico da entrada é a resposta de sucesso: depois dela, o padrão exige que o servidor que a emitiu assuma a responsabilidade de entregar a mensagem ou de reportar a falha.
Nesta leitura, a entrada é desenhada com uma fila de mensagens entre o servidor SMTP e o processamento da mensagem.
O servidor do remetente consulta o DNS para descobrir quais servidores recebem o e-mail do domínio de destino.
Ele abre a conexão SMTP com o servidor de entrada indicado e transmite a mensagem.
O servidor de entrada passa a mensagem para a fila de entrada; a resposta de sucesso ao remetente marca a transferência de responsabilidade.
Um consumidor tira a mensagem da fila e a passa pelo filtro anti-spam, detalhado mais adiante.
O conteúdo vai para o armazenamento de mensagens e o índice da caixa registra a nova mensagem.
A mensagem que não pode ser transmitida de imediato deve ser enfileirada e retentada periodicamente, e a entrada da fila guarda a mensagem junto com as informações do envelope. O padrão pede que o intervalo entre tentativas seja de pelo menos 30 minutos e que o prazo de desistência seja de pelo menos 4-5 dias. Um erro temporário na consulta MX também leva a mensagem à fila para nova tentativa.
03 · ARMAZENAMENTO DE CAIXAS
Formatos de caixa e acesso por IMAP
A documentação do Dovecot lista formatos de caixa que organizam as mensagens em disco de jeitos bem diferentes.
| Formato | Organização | O que a documentação destaca |
|---|---|---|
| mbox | Um único arquivo contém várias mensagens | Formato tradicional de caixa UNIX |
| Maildir | Um arquivo contém uma mensagem | Arquivos nunca são modificados e as operações são atômicas |
| dbox | Mensagens em um ou mais arquivos, cada um com uma ou mais mensagens | Formato próprio de alto desempenho do Dovecot |
No Maildir, o diretório tmp é usado durante a entrega. A documentação também recomenda manter os arquivos de índice em disco diferente do spool de mensagens, o que dá melhor desempenho.
Do lado do cliente, o IMAP permite acessar e manipular as mensagens que ficam no servidor. As mensagens são referidas por números de sequência ou por identificadores únicos, o protocolo prevê flags e a obtenção seletiva de partes da mensagem, e o cliente offline consegue ressincronizar com o servidor. O IMAP também exige um número de identificação único e permanente por mensagem.
Os identificadores persistentes são o que permite ao cliente ressincronizar o estado de uma sessão anterior, e qualquer mudança deles entre sessões deve ser detectável pelo mecanismo UIDVALIDITY.
O cliente de e-mail abre uma sessão IMAP e acessa as mensagens guardadas no servidor.
O servidor IMAP lê no índice da caixa os identificadores e as flags das mensagens.
Ao abrir uma mensagem, o servidor busca no armazenamento só as partes pedidas.
Para enviar, o cliente entrega a mensagem ao servidor de submissão, que a coloca na fila de saída.
O transmissor SMTP consome a fila de saída e retenta a entrega até conseguir ou desistir.
Uma proposta de desenho para a entrevista: guardar o conteúdo bruto das mensagens e dos anexos em armazenamento de objetos e manter em um banco de documentos só os metadados de cada mensagem, como pasta, flags e identificador. O servidor IMAP responderia listagens e filtros por flag a partir do índice e só iria ao armazenamento de objetos para ler o conteúdo. Essa separação cobre a escolha do banco de dados e a modelagem dos dados, e uma busca por texto exigiria um sistema de busca à parte.
04 · ANTI-SPAM
Autenticar o remetente e pontuar o conteúdo
O protocolo de transporte não impede que alguém se passe por outro domínio: os protocolos existentes não restringem o que um host remetente pode usar como MAIL FROM de uma mensagem. Três mecanismos públicos tratam desse problema. O SPF permite que um domínio autorize explicitamente os hosts que podem usar seu nome e que o receptor verifique essa autorização. No DKIM, a responsabilidade é validada por assinatura criptográfica e pela consulta direta ao domínio do assinante para obter a chave pública. O DMARC deixa a organização de origem expressar políticas de validação, disposição e relatório que o receptor pode usar.
O Apache SpamAssassin é um filtro para classificar e-mail e bloquear spam: usa um framework de pontuação e plug-ins que integram testes heurísticos e estatísticos sobre cabeçalhos e corpo, incluindo filtro bayesiano, listas de bloqueio via DNS e bancos colaborativos. Segundo o projeto, a ampla variedade de testes locais e de rede identifica assinaturas de spam, e o filtro pode ser integrado em qualquer ponto do fluxo de e-mail.
A mensagem recebida segue do servidor de entrada para o verificador de autenticação.
O verificador checa a autorização do host pelo SPF e obtém a chave pública do assinante consultando o domínio dele, no DKIM; o DMARC expressa a política do domínio que o receptor pode usar.
A mensagem segue para a pontuação de conteúdo, que soma testes sobre cabeçalhos e corpo, incluindo listas de bloqueio via DNS.
A pontuação consulta as regras e os dados do filtro estatístico, mantidos à parte do fluxo da mensagem.
Conforme a classificação, a mensagem é guardada na pasta indicada, como a caixa de entrada ou a pasta de spam.
05 · VISÃO COMPLETA
Juntando as peças e o que defender
Juntando os caminhos, o serviço tem uma via de entrada (DNS, servidor SMTP, fila, filtro e armazenamento), uma via de acesso (IMAP ou webmail lendo o índice e o armazenamento) e uma via de saída (submissão, fila e transmissor). As três compartilham o mesmo armazenamento de mensagens.
Entrada: servidores externos descobrem o destino no DNS, o servidor SMTP aceita a mensagem e a coloca na fila de entrada.
Processamento: o filtro consome a fila, classifica a mensagem e a grava no armazenamento e no índice.
Acesso: o cliente lê pastas e mensagens pelo servidor IMAP, que usa o índice e o armazenamento.
Saída: o cliente envia pelo servidor de submissão, a mensagem espera na fila de saída e segue para servidores externos.
Perguntas frequentes
O que é Serviço de e-mail distribuído (Gmail)?
Projeto de entrevista clássico. Pontos centrais: entrega de blobs e vídeo e SMTP/IMAP.
O que o design de Serviço de e-mail distribuído (Gmail) cobre?
Ele está organizado nestas seções: O que um serviço de e-mail precisa fazer, SMTP, DNS e filas de retentativa, Formatos de caixa e acesso por IMAP, Autenticar o remetente e pontuar o conteúdo e Juntando as peças e o que defender.
Quanto tempo leva Serviço de e-mail distribuído (Gmail) e qual é o nível?
Leva cerca de 16 minutos para ler e tem nível Sênior.
Agora projete você mesmo
Rode este caso como uma entrevista na escola de System Design: você toma as decisões, o tutor as questiona e você vê a nota do seu desenho.