Gleam OTP – desenvolvimento de programas multicore tolerantes a falhas com base em atores
(github.com/gleam-lang)- Gleam OTP oferece suporte ao desenvolvimento de programas com modelo de atores, com tolerância a falhas e desempenho multicore
- Tem como características o foco em segurança de tipos completa e compatibilidade com Erlang OTP
- Fornece recuperação de falhas e autocura por meio de supervisores
- Oferece apenas parte dos recursos do Erlang/OTP, e estratégias adicionais de gerenciamento estão em desenvolvimento
- Suporta diversos tipos de ator, como processos comuns, atores e supervisores
Visão geral do Gleam OTP
- Gleam OTP é um poderoso framework de atores inspirado na arquitetura OTP do Erlang, adequado para implementar programas multicore tolerantes a falhas
- É um projeto open source sob a licença Apache-2.0
Principais características e vantagens
- Garante segurança de tipos completa para atores e mensagens
- Oferece compatibilidade com Erlang OTP, facilitando a integração com ambientes Erlang já existentes
- Dá suporte à tolerância a falhas por meio de supervisores (supervisor), com detecção de falhas, recuperação automática e gerenciamento de encerramento
- Busca atingir o mesmo desempenho do Erlang OTP
- A documentação e os exemplos facilitam o aprendizado e a adoção em uso real
Explicação por tipo de ator
-
Processo (process)
- Atua como o bloco de construção mais básico dentro do OTP
- Serve de base para outros tipos de ator, mas não costuma ser usado diretamente com frequência em aplicações Gleam
-
Ator (actor)
- É o tipo de processo mais usado e oferece funcionalidades semelhantes ao gen_server do Erlang
- Processa automaticamente mensagens de sistema do OTP e habilita recursos de depuração e rastreamento
-
Supervisor (supervisor)
- É responsável por iniciar outros processos e por sua supervisão e recuperação
- Reinicia automaticamente processos filhos em caso de falhas ou exceções
- Forma a estrutura de tolerância a falhas da aplicação por meio de uma árvore de supervisão (supervision tree)
- É possível conferir os detalhes de implementação na documentação de
gleam/otp/static_supervisoregleam/otp/factory_supervisor
Limitações e questões
- Atualmente, os atores não oferecem suporte a todas as mensagens de sistema do OTP, e mensagens não suportadas são ignoradas
- Alguns recursos da API de depuração do OTP são limitados
- Se necessário, é possível solicitar suporte a mensagens ainda não implementadas por meio do registro de issues
Conclusão e importância do projeto
- Gleam OTP amplia os pontos fortes do ecossistema Erlang para a linguagem Gleam, o que é especialmente relevante por permitir segurança de tipos e tolerância a falhas multicore
- É adequado para aplicações em produção nas quais estabilidade e desempenho são importantes
- É um projeto open source de alto valor para aprendizado e aplicação prática por startups, desenvolvedores especializados em TI e desenvolvedores em geral
1 comentários
Comentários no Hacker News
Se você se interessa por tipagem estática, ausência de null, programação funcional e linguagens da família ML, recomendo experimentar gleam
E, claro, roda na BEAM
Instalei gleam e ele puxou umas 50 dependências no meu sistema, então imagino que sejam pacotes relacionados a Erlang/Elixir
Fiquei me perguntando como seria se eu quisesse transpilar só para JS. Talvez seja só uma questão de empacotamento no meu sistema
Seria ainda melhor se houvesse suporte a Lua como alvo de transpilação. Na minha opinião, embutir uma DSL em outro programa com Lua é umas 3 vezes mais fácil do que com um runtime de JS
De longe, a melhor parte até agora tem sido a comunidade. A qualidade das bibliotecas e dos materiais da comunidade de gleam é extremamente alta
Me lembra a comunidade Rust, em que as pessoas inteligentes já enfrentaram os problemas difíceis e publicaram soluções muito boas (lustre, squirrel etc.)
Outra característica é a quantidade de experimentação e tentativas criativas. Coisas que quase não aparecem em ecossistemas de linguagens maiores aqui acabam se destacando. E, à medida que a comunidade cresce, o clima é muito acolhedor
Pode recomendar por onde começar a aprender?
Estou pesquisando porque seria muito bom poder usar Gleam junto com um framework como Phoenix
No momento estou preparando um projeto novo em Python, mas, se houver alguma opção viável com Gleam, gostaria de tentar
A vantagem é que fica muito fácil escolher quais partes entram no frontend e no backend
link do YouTube
Em vez disso, há ferramentas usadas com frequência para criar aplicações web
Lustre é a ferramenta básica de view, e Wisp faz o papel de servidor
Para SQL, há squirrel e POG (novo, mas popular)
É uma boa opção se você quer uma alternativa com tipagem estática na BEAM
É como um dialeto de Haskell, com avaliação estrita e suporte a row polymorphism
Fico curioso sobre como isso é usado na prática. As pessoas constroem toda a lógica do serviço nisso ou usam só em partes específicas?
Levamos o padrão "functional core, imperative shell" ao extremo e isolamos o Gleam para lidar com tarefas de computação pesada dentro de uma base de código Ruby on Rails já existente
Quase não usamos recursos de OTP, e deixamos o Rails focado apenas naquilo em que ele é naturalmente forte, como web UI e HTTP API
O Rails fica responsável por preparar os valores de entrada dos jobs, e os dados dos jobs são passados ao Gleam via Redis como um único conjunto atômico de valores
Fizemos um wrapper fino em Elixir para lidar apenas com rede e file I/O, enquanto a lógica de negócio fica nos módulos em Gleam
Pretendo escrever em breve um artigo explicando com mais detalhes técnicos essa abordagem. É um tema que costuma despertar interesse no HN
Elixir é uma excelente linguagem de propósito geral e tem pontos fortes em várias áreas
Para uma conversa mais detalhada, veja meu vídeo no Developer Voices
link do YouTube
Muita gente está construindo sistemas sérios usando apenas Erlang/Elixir & BEAM, então, se você tiver dúvidas, o pessoal deve responder bem
Depois que você entende OTP o suficiente, construir todo o sistema em cima dele parece natural
Eu mesmo trabalhei assim por 7 anos, mas percebi que leva bastante tempo para desenvolvedores iniciantes se acostumarem com esse ecossistema
Não vejo necessidade de trazer política para a página de um projeto técnico
Não é uma questão de concordar ou discordar; só acho mais adequado deixar esse tipo de discussão de fora em um contexto profissional
Caso contrário, a conversa acaba se desviando desnecessariamente do assunto
"Black lives matter. Trans rights are human rights. No nazi bullsh*t."?
Se alguém decide não usar por causa dessa frase, então está funcionando exatamente como foi planejado
Mas, na verdade, me parece que foi você quem fez isso acontecer
Para mim, se o objetivo é tolerância a falhas e uso de múltiplos núcleos, parece melhor usar memória transacional de software e sistemas de efeitos funcionais, como em Scala/ZIO
Ainda assim, o modelo de atores pode ser usado quando necessário
Além disso, considerando a maturidade do ecossistema JVM, observabilidade e prontidão para produção, ele me parece superior à BEAM
Entendo criticar os pontos fracos da BEAM, mas acho estranho criticar justamente aquilo em que ela é forte
A BEAM funciona com mensagens imutáveis trocadas entre green threads leves e baratas
Há um sistema robusto de supervisão (
supervisor trees), então você não precisa se preocupar com data races nem com travamento de threadsTudo isso já vem embutido por padrão, sem boilerplate
Graças à imutabilidade, o desempenho também é surpreendentemente bom
No fim das contas, a BEAM é a plataforma mais otimizada para sistemas tolerantes a falhas, distribuídos e concorrentes
Um dos grandes fatores por trás dessa robustez é sua infraestrutura de supervisão robusta e entre máquinas
Foi uma linguagem que inspirou fortemente o surgimento dos sistemas de atores
Literalmente, Erlang existe para fazer isso e faz muito bem
Se houver dados que realmente precisem ser compartilhados, então eles necessariamente devem ser imutáveis
A única coisa em que consigo pensar é computação numérica extremamente pesada, mas, nesse caso, você não escreveria isso diretamente em elixir ou erlang; implementaria como NIF
Mesmo sem usar explicitamente o padrão actor, repasse de estado e coordenação já são problemas resolvidos
Há várias primitivas básicas, como tasks, agents, GenServer e Supervisor