12 pontos por GN⁺ 2024-11-21 | 3 comentários | Compartilhar no WhatsApp
  • Um dos recursos mais poderosos do ecossistema Erlang é a atualização de código quente
  • Esse recurso é muito único e praticamente impossível em outros runtimes
  • Elixir foi construído sobre Erlang e oferece suporte ao mesmo recurso

Aplicando atualizações de código quente no Elixir

  • O método padrão de release do Elixir (mix release) não oferece suporte nativo a atualizações de código quente do Erlang
  • Para implementar atualizações de código quente, é preciso consultar vários posts de blog ou estudar em detalhe a documentação oficial do Erlang
  • Materiais relacionados:

Casos reais de uso de atualizações de código quente

  • Na prática, as atualizações de código quente se dividem em duas grandes categorias:
    1. Recarregamento simples de código
      • Ex.: executar os comandos r MyModule ou recompile no IEx durante o desenvolvimento
      • Isso é simples e útil, mas parece mais parte de um novo compilador ou builder
    2. Aplicações mais complexas
      • O projeto Nerves usa atualizações de código quente com frequência:
        • Em dispositivos Elixir embarcados, ao ajustar números ou modificar módulos, atualiza-se via IEx em vez de esperar o upload do firmware e a reinicialização
        • Também é possível iniciar/parar partes específicas da aplicação ou encerrar um GenServer para reinicializar seu estado
      • Aplicação de atualizações de código quente em dispositivos remotos por meio do NervesHub:
        • Ex.: ao depurar um relógio em tempo real, executar chamadas I2C diretamente para identificar o problema rapidamente

Ferramentas e cuidados nas atualizações de código quente

  • Há a expectativa de que surjam mais ferramentas com suporte a atualizações de código quente sobre o mix release do Elixir ou a ferramenta legada distillery
  • Atualizações de código quente exigem cuidado minucioso, assim como migrações de banco de dados:
    • É preciso entender como as dependências reagem a atualizações de código quente
    • Há vários outros aspectos que também precisam ser considerados

3 comentários

 
bus710 2024-11-22

Esse conteúdo também está explicado em detalhes em Aprendendo Programação em Elixir pela Primeira Vez, o único livro de tradução sobre Elixir do país.

 
papillon 2024-11-21

É um recurso bacana e poderoso, mas acho que é melhor usá-lo apenas para depuração e verificação em tempo real

 
GN⁺ 2024-11-21
Comentários do Hacker News
  • No Discord, usaram o hot code loading do BEAM para encurtar ciclos longos de deploy e aplicar atualizações urgentes

    • Desenvolveram uma ferramenta para corrigir vários módulos ao mesmo tempo e propagar as atualizações pelo cluster
    • Distribuíram hot patches usando os recursos nativos de distribuição do Erlang
  • Em dispositivos Nerves, o recarregamento de código é útil e permite testar alterações em tempo real, sendo ótimo para testes de integração

    • Testaram e atualizaram remotamente novo firmware, deixando os clientes satisfeitos
    • Copiar arquivos para /tmp e depois usar Code.compile fornece mensagens de erro melhores
    • É simples escrever uma função auxiliar para compilar e apagar todo o código
  • Não puderam usar hot code updates em um projeto Elixir, mas acham que isso teria ajudado os clientes

    • Em mudanças complexas, hot code updates podem causar ainda mais problemas
    • Para mudanças simples, é melhor causar o mínimo de impacto possível
  • Estão usando hot code upgrades com sucesso no kosmi.io

    • Isso permite desenvolver e corrigir rapidamente, além de distribuir atualizações
    • Usam Distillery e scripts personalizados, mas gostariam que isso fosse padronizado
  • Passaram a se interessar por Erlang por causa do Nerves e do hot code reloading

    • Não é algo prático em ambiente de produção, mas é uma ferramenta útil para construir sistemas confiáveis
  • É preciso ter muito cuidado ao preparar um relup, e no Linux também existe a opção de subir um novo servidor e transferir os dados da sessão

    • Hot patching pode não ser tão satisfatório porque a mesma VM continua rodando
  • Fazem deploy de Elixir em Linux embarcado, com o Nerves substituindo o systemd e inicializando a VM BEAM como processo 1

    • Isso coloca o Elixir mais perto do hardware
  • No passado, o WhatsApp usava scripts SSH para fazer hot reloading em todos os nós

  • Hot code updates são úteis, mas podem induzir erros com facilidade e têm pouco suporte

    • Os benefícios do hot code updates também podem ser obtidos com reinicializações rolling cuidadosas
    • É possível aproveitar o recurso de recarregamento de código do Erlang para criar ferramentas de diagnóstico de problemas em tempo real
  • Hot code updates são vantajosos ao alterar código em situações com muitos clientes conectados

    • Usavam GNU Make para sincronizar o código em produção e carregavam módulos por meio de um shell de depuração