Uso de Elixir Phoenix en un Proyecto SaaS Comercial

Linkly está escrito en Elixir.

Siempre había querido tener exposición al ecosistema Erlang, y Elixir es una ruta fácil.

No cubriré los beneficios de BEAM o Erlang directamente aquí, ya que eso se ha escrito en otros lugares. En cambio, me centraré en los aspectos prácticos de usar Elixir Phoenix para un proyecto real.

Voy a asumir que sabes qué es Ruby on Rails, ya que Phoenix, el framework web de Elixir, está fuertemente inspirado en Rails.

Programando Realmente en Elixir Phoenix

Escribir en Elixir es una experiencia alegre.

Sigue paradigmas similares a Rails, incluyendo MVC, e incluso se ve similar.

A diferencia de Rails, el código se compila antes de ejecutarse. Este es un paso útil ya que te permite detectar errores que de otra manera podrías no haber detectado.

Los modelos en Phoenix están agrupados en 'Contexts'. Este es un nivel adicional de abstracción, destinado a crear una separación clara entre partes de aplicaciones, por ejemplo, Usuarios y Productos. Cada contexto puede contener cualquier número de modelos.

Rendimiento

Se ha hablado mucho sobre el rendimiento en otros blogs, así que cubriré el lado práctico aquí.

Para un framework web completamente funcional, el rendimiento es claramente mucho más rápido que Rails, y requiere sustancialmente menos hardware para ejecutarse.

El tiempo 'de arranque' de ejecutar mix phx.server vs rails server es más rápido. Incluso cuando se desarrolla en una laptop, las páginas cargan notablemente más rápido con Phoenix.

Disponibilidad de Paquetes para Elixir Phoenix vs Rails

Superficialmente, parece que hay una diferencia aquí. Rails tiene muchos miles de gemas versus el repositorio Hex de Elixir.

Como sucede, casi todo lo que realmente usarías está disponible en el sistema de paquetes Elixir Hex - analizadores JSON, clientes HTTP, herramientas para formatear y analizar Markdown - todo está ahí, y la calidad de los módulos es excepcional.

En Rails, hay sustancialmente más gemas, pero nunca las incluirías en un proyecto real, debido a su estado sin mantenimiento o al riesgo asociado con incorporar demasiadas dependencias externas en tu aplicación.

Plataformas como Stripe y Recurly mantienen sus propias gemas Rails para interactuar con sus APIs. Esto puede ser útil, y generalmente carecen de soporte para Elixir.

Sin embargo, encontré que era muy fácil usar el paquete Tesla de Elixir para interactuar con endpoints HTTP de servicios, y finalmente terminé prefiriendo trabajar de esta manera, versus usar gemas pre-empaquetadas, ya que es más ligero y te permite entender qué está sucediendo.

Abstracción de Base de Datos - Ecto y ActiveRecord

Ecto no tiene tantas funcionalidades como ActiveRecord.

No está destinado a tenerlas.

Ecto es un envoltorio de base de datos simple que mapea consultas de base de datos a objetos Elixir.

Inicialmente, encontré frustrante que no funcionara exactamente como ActiveRecord.

Sin embargo, Ecto te permite interactuar con la base de datos de una manera muy directa, y en realidad hace que programar aplicaciones web sea mucho más fácil.

Con ActiveRecord, una vez que comienzas a construir consultas complejas, toma más tiempo descifrar ActiveRecord que simplemente escribir una consulta como SQL.

Habiendo usado ambos, es mi conclusión que usar un envoltorio de base de datos ligero como Ecto es más fácil que usar una abstracción pesada como ActiveRecord.

Te da la seguridad de usar un envoltorio de base de datos, sin el dolor de cabeza y el peso de una abstracción "demasiado inteligente".

Ambos contienen funcionalidad de migración y reversión.

La base de datos predeterminada para proyectos Phoenix es Postgres.

Para aquellos que usan bases de datos NoSQL, Ecto funciona con Mongo.

Mejor aún, Ecto funciona con las funcionalidades NoSQL de Postgres, permitiéndote guardar y consultar JSON sin necesitar Mongo.

Autenticación de Usuarios

Este es un área donde Elixir Phoenix está deficiente.

Rails tiene el módulo Devise. Phoenix tiene Coherence, sin embargo actualmente no tiene mantenimiento.

Si quieres usar un inicio de sesión básico de nombre de usuario y contraseña, tendrás que construir cada paso de eso. Eso incluye el hash de contraseñas, la lógica de restablecimiento de contraseñas, configuraciones de 'recuérdame', etc.

Esto es tedioso y conlleva un riesgo de seguridad sustancial.

Opté por usar Auth0, que funcionó bien con Phoenix. Quizás esta sea una mejor solución de todos modos, pero habría sido agradable haber tenido una opción.

Despliegue y Alojamiento

El principal host de aplicaciones Phoenix es Gigalixir, una pequeña empresa americana dirigida por entusiastas de Elixir.

Gigalixir está alojado en Google Cloud, por lo que la infraestructura subyacente es sólida.

El buildpack de Gigalixir hace que el despliegue sea fácil, y soporta todas las estrategias de despliegue inteligentes de Elixir (distillery, mix).

Es más caro que 'hazlo tú mismo', pero la mayor parte del costo está incluido en el alojamiento de la base de datos Postgres.

Elixir Phoenix es tan ligero que puede ejecutarse en pequeños pods docker y aún así manejar un número muy saludable de solicitudes.

A pesar del margen, vale absolutamente la pena para quitarse el dolor de cabeza.

Solo agregaré que su atención al cliente es excepcional.

Disponibilidad de Programadores

Hay sustancialmente menos programadores de Elixir por ahí.

Elixir es un "lenguaje de programadores" - un lenguaje al que la gente llega, habiendo aprendido algo más.

Dicho esto, aquellos que hacen Elixir son típicamente mejores programadores. Quizás sea la elección consciente de elegir un mejor lenguaje.

Me recuerda a los primeros días de Rails, donde parecía que solo los "rockstars" lo usarían (versus PHP).

Cualquier buen programador de Rails no tendrá problema en aprender Elixir Phoenix, y estará funcionando en unos pocos días.

¿Usaría Elixir Phoenix otra vez?

Definitivamente.

He trabajado con muchos lenguajes, y Elixir es el más fácil y poderoso con el que he trabajado.

Espero con ansias escribir Elixir.

Rastrea 500 clics mensuales con todas las características incluidas.

No se requiere tarjeta de crédito