Razón Técnica: La Erlang VM (Beam) tiene más de 30 años de evolución en entornos distribuidos y concurrentes, lo que la hace ideal para los sistemas de hoy.
Razón Negocio: Utilizar tecnologías modernas como Elixir permite contratar personas curiosas, lo que es más probable que sean buenos candidatos. La disminución de las dependencias permitirá ahorrar costos a mediano y largo plazo.
Razón Emocional: Elixir y Phoenix son lenguajes y frameworks modernos y fáciles de aprender, lo que lo haces entretenidos y permite motivar a las personas a experimentar y generar nuevas ideas o soluciones.
Disclaimer: Soy muy novato en el mundo Elixir, he hecho poco más que unos tutoriales.
Me da cierta sensación de que aprender a usar Phoenix te blinda de aprender las ventajas de la máquina virtual Elixir. El generador de proyectos ya te da un template con todo configurado bien, así que para qué cambiarlo. Y después, ya es volver al “típico” workflow de desarrollo web MVC, obteniendo valores de una BBDD y usándolos en templates (aunque con las conveniencias de un framework moderno, y con LiveView).
Cuán normal es hacer árboles de supervisión nuevos en un proyecto Phoenix? O, ¿qué otras funcionalidades de la BEAM se suelen usar en proyectos Phoenix? Me hace ruido que Phoenix haya tenido que armar una librería para hacer PubSub, pensé que eso era parte del lenguaje, o se solía hacer con GenServer.
Hola, gracias por comentar. Acá algunas respuestas.
- Puedes armar proyectos de APIs solo utilizando Plug y Mix, Phoenix solo te da una estructura estandarizada y herramientas adicionales. En nuestro bot de MSN Messenger solamente utilizamos Plug sin Phoenix ya que solo se necesitaba un endpoint GET simple.
https://github.com/ElixirCL/msn-chatbot/blob/main/lib/msn_chatbot.ex
- Es bastante normal tener GenServers en proyectos Phoenix, sobre todo para cosas que requieren algo que guarde estado. Por ejemplo en nuestro Bot de Discord, usamos un elemento supervisado para la conexión a Discord, y en nuestro bot de MSN Messenger guardamos el historial de conversaciones.
https://github.com/ElixirCL/mate/blob/main/lib/mate/application.ex#L22
- PubSub de Phoenix es una abstracción que nos permite simplificar el uso del patrón de Publishers/Subscribers. El implementar este patrón con un GenServer o GenStage es viable, sin embargo, se debe considerar la persistencia y tomar casos de uso de reintentos al enviar los eventos, para estos casos es mejor utilizar soluciones estandarizadas que elaborar algo propio.
Algunos links de interés.
- https://elixir-lang.org/blog/2016/07/14/announcing-genstage/
- https://elixirschool.com/en/lessons/data_processing/genstage
- https://www.pompecki.com/post/phoenix-pubsub/
- https://blog.appsignal.com/2018/11/13/elixir-alchemy-understanding-elixirs-genstages-querying-the-blockchain.html
Según nuestro amigo @emoragaf de nuestro Discord
Sip, por ejemplo en teoría yo podría usar unos gen stages para manejar alertas en tiempo real en live view, pero hay cosas extra que gen stage provee que probablemente nunca aprovecharía, en ese sentido pubsub es más simple, pero se adapta mejor a ese caso de uso en particular Por el otro lado, yo podría usar pubsub para procesar datos, pero quizás tendría que implementar a mano batching, gen stage en ese caso sería mejor fit ya que incluye abstracciones como esa