Pergunta de entrevista para Desenvolvedor Python

Me explique como entregar uma migração de banco de dados sem downtime.

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Divida em passos retrocompatíveis. Suba primeiro a mudança de schema numa forma que o código rodando tolera, como adicionar uma coluna nullable, depois suba código que escreve no antigo e no novo, faça o backfill em lotes, mude as leituras, e só derrube a coluna antiga num release posterior. Evite locks longos de tabela e sempre teste o caminho de rollback.

Por que os entrevistadores perguntam isso

Migrações são onde engenheiros cuidadosos se separam de quem só trabalhou em projetos pequenos o bastante para aceitar uma parada. O entrevistador quer o padrão expand and contract, o entendimento de que código antigo e novo rodam simultaneamente durante um deploy gradual, e consciência de quais operações travam uma tabela no Postgres tempo suficiente para derrubar o site.

Como estruturar sua resposta

  • Cite o padrão expand and contract.
  • Ordene os deploys para as duas versões do código funcionarem.
  • Faça backfill em lotes, nunca num único comando.
  • Aponte as operações de lock a serem evitadas.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A regra que eu sigo é que durante um deploy gradual duas versões do código estão falando com um banco só, então cada passo tem que ser seguro para as duas. Renomear uma coluna é a armadilha clássica. Em vez disso eu expando: adiciono a coluna nova nullable na própria migração, subo código que escreve nos dois campos e ainda lê o antigo, faço backfill das linhas existentes em lotes de alguns milhares com uma pausa entre eles para a replicação não ficar para trás, aí viro as leituras no release seguinte, e só num terceiro release derrubo a coluna antiga. Especificidades do Postgres também importam. Adicionar uma constraint NOT NULL numa tabela grande pega um lock pesado, então eu adiciono a coluna nullable, faço o backfill, e depois valido a constraint separadamente. O Django te dá separate_database_and_state e migrações não atômicas quando você precisa, e eu configuro um lock_timeout curto para uma migração bloqueada falhar rápido em vez de enfileirar toda query atrás dela. Toda migração também ganha um rollback testado.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • E se o backfill levar seis horas?
  • Como você adiciona um índice sem bloquear escritas?
  • Como você faz rollback de um deploy depois que o schema mudou?

Mais perguntas para Desenvolvedor Python

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot