Gleam OTP – desarrollo de programas tolerantes a fallos y multinúcleo basados en actores
(github.com/gleam-lang)- Gleam OTP ayuda a desarrollar programas con tolerancia a fallos y rendimiento multinúcleo usando el modelo de actores
- Se caracteriza por buscar seguridad de tipos completa y compatibilidad con Erlang OTP
- Ofrece recuperación ante fallos y capacidades de autocuración mediante supervisores
- Solo ofrece parte de las funciones de Erlang/OTP, y estrategias de gestión adicionales están actualmente en desarrollo
- Soporta varios tipos de actores, incluidos procesos generales, actores y supervisores
Resumen de Gleam OTP
- Gleam OTP es un potente framework de actores inspirado en la arquitectura OTP de Erlang, adecuado para implementar programas multinúcleo tolerantes a fallos
- Es un proyecto de código abierto bajo la licencia Apache-2.0
Características y ventajas principales
- Garantiza seguridad de tipos completa para actores y mensajes
- Ofrece compatibilidad con Erlang OTP, lo que facilita la integración con entornos Erlang existentes
- Brinda tolerancia a fallos mediante supervisores (supervisor) para detección de fallos, recuperación automática y gestión de terminación
- Busca alcanzar un rendimiento equivalente al de Erlang OTP
- Su documentación y ejemplos facilitan el aprendizaje y la aplicación en casos reales
Descripción por tipo de actor
-
Proceso (process)
- Cumple el rol de bloque de construcción más básico dentro de OTP
- Sirve como base para otros tipos de actores, pero no suele usarse directamente con frecuencia en aplicaciones Gleam
-
Actor (actor)
- Es el tipo de proceso más utilizado y ofrece funcionalidades similares a gen_server de Erlang
- Maneja automáticamente mensajes del sistema OTP y habilita funciones de depuración y trazado
-
Supervisor (supervisor)
- Se encarga de iniciar otros procesos y de su supervisión y recuperación
- Reinicia automáticamente los procesos hijo cuando ocurren fallos o excepciones
- Mediante una estructura anidada de supervisores (supervision tree) forma la arquitectura de tolerancia a fallos de la aplicación
- Se puede revisar la implementación detallada en la documentación de
gleam/otp/static_supervisorygleam/otp/factory_supervisor
Limitaciones y problemas
- Actualmente los actores no soportan todos los mensajes del sistema OTP; los mensajes no soportados se ignoran
- Algunas funciones de la API de depuración de OTP son limitadas
- Si es necesario, se puede solicitar soporte para mensajes no implementados mediante la creación de un issue
Conclusión e importancia del proyecto
- Gleam OTP amplía las fortalezas del ecosistema Erlang al lenguaje Gleam, y tiene gran importancia por permitir implementar seguridad de tipos y tolerancia a fallos multinúcleo
- Es adecuado para aplicaciones donde la estabilidad y el rendimiento son importantes en producción
- Es un proyecto de código abierto con alto valor para aprender y aplicar en la práctica para startups, desarrolladores especializados en TI y desarrolladores en general
1 comentarios
Opiniones de Hacker News
Si te interesan el tipado estático, un entorno sin null, lo funcional y los lenguajes de la familia ML, te recomiendo probar gleam
Y además, por supuesto, corre sobre BEAM
Instalé gleam y se me instalaron como 50 paquetes en mi sistema; supongo que deben ser paquetes relacionados con Erlang/Elixir
Me pregunto qué pasaría si solo quisiera transpilar a JS. Tal vez sea un tema del empaquetado de mi sistema
También estaría mejor si soportara Lua como objetivo de transpilación. Siento que, para incrustar un DSL en otros programas, Lua es tres veces más fácil que un runtime de JS
Y sobre todo, lo que más me ha gustado hasta ahora es la comunidad. La calidad de las librerías y los recursos de la comunidad de gleam es altísima
Me recuerda a la comunidad de Rust: la gente inteligente ya ha trabajado los problemas difíciles, así que es fácil encontrar buenas soluciones (lustre, squirrel, etc.)
Otra característica es que se ve mucha experimentación e intentos creativos. Cosas que casi no se ven en ecosistemas de lenguajes grandes aquí sí destacan. A medida que la comunidad crece, el ambiente se siente muy acogedor
¿Podrías recomendar por dónde empezar a aprender?
Estoy investigando porque sería genial poder usar Gleam junto con un framework como Phoenix
Ahorita estoy preparando un proyecto nuevo en Python, pero si Gleam también es una opción viable, me gustaría intentarlo
La ventaja es que puedes decidir muy fácilmente qué parte va en el frontend y cuál en el backend
Enlace de YouTube
Pero sí hay herramientas que se usan mucho al crear aplicaciones web
Lustre es la herramienta básica de vistas y Wisp hace el papel de servidor
Para SQL están squirrel y POG (es nuevo, pero está ganando popularidad)
Es una buena opción si necesitas una alternativa de tipado estático en BEAM
Es como un dialecto de Haskell, con evaluación estricta y soporte para row polymorphism
Me da curiosidad cómo se usa en el trabajo real. Si se construye toda la lógica del servicio ahí, o si solo se usa para partes específicas
Llevamos el patrón de "functional core, imperative shell" al extremo y separamos a Gleam para encargarse de las tareas de cómputo pesado dentro de una base de código existente en Ruby on Rails
Casi no usamos funciones de OTP, y Rails se enfoca solo en sus fortalezas naturales, como la UI web y la API HTTP
Rails se encarga de preparar los valores de entrada de los jobs, y los datos del job se pasan a Gleam a través de Redis como un solo conjunto atómico de valores
Hicimos un wrapper delgado en Elixir para manejar solo red y file IO, y la lógica de negocio queda en módulos de Gleam
Estoy pensando escribir pronto un artículo con más detalle técnico sobre este enfoque. Es un tema que suele interesar mucho en HN
Elixir es un excelente lenguaje de propósito general y tiene fortalezas en muchas áreas
Para una conversación más detallada, revisa mi video de Developer Voices
Enlace de YouTube
Mucha gente construye sistemas serios usando solo Erlang/Elixir y BEAM, así que si tienes preguntas te van a responder bien
Una vez que entiendes bien OTP, se vuelve natural construir todo el sistema sobre eso
Yo lo hice así durante 7 años, aunque también vi que a los desarrolladores nuevos les toma bastante tiempo acostumbrarse a este ecosistema
No veo por qué hay que meter política en la página de un proyecto técnico
No se trata de estar de acuerdo o no, sino de que en un espacio profesional sería preferible dejar fuera ese tipo de discusión
Si no, la conversación se desvía innecesariamente del punto
Si alguien decide no usarlo por una sola línea como esa, entonces diría que está funcionando exactamente como se pretendía
Pero más bien da la impresión de que fuiste tú quien la desvió
Desde mi punto de vista, para tolerancia a fallos y multicore es mejor usar memoria transaccional de software y un sistema de efectos funcionales, como en Scala/ZIO
Eso no quita que el modelo de actores siga siendo útil cuando hace falta
Además, si ves la madurez del ecosistema JVM, la observabilidad y lo probado que está en producción, supera a BEAM
Entiendo criticar las debilidades de BEAM, pero no tanto criticar justo lo que más fuerte tiene
BEAM está diseñado para pasar mensajes inmutables entre green threads ligeros y baratos
Tiene un sistema sólido de supervisión (
supervisor trees), así que no tienes que preocuparte por data races ni por bloqueos de hilosTodo eso viene integrado de base, sin boilerplate
Gracias a la inmutabilidad, el rendimiento también es sorprendentemente bueno
Al final, BEAM es una plataforma especialmente optimizada para tolerancia a fallos y sistemas distribuidos/concurrentes
Uno de los grandes factores que permiten esa durabilidad es su infraestructura robusta de supervisión y entre máquinas
Es un lenguaje que inspiró enormemente la aparición de los sistemas de actores
Literalmente, Erlang existe para esta sola cosa, y la hace muy bien
Si hay datos que de verdad deban compartirse, entonces necesariamente tienen que ser inmutables
Lo único que se me ocurre son cálculos numéricos extremadamente pesados, pero en esos casos no lo escribirías directamente en elixir o erlang, sino como un NIF
Aunque no uses explícitamente el patrón actor, el paso y la coordinación del estado ya son problemas resueltos
Tienes todas las primitivas básicas: tasks, agents, GenServer, Supervisor, etc.