Utilizzo di Elixir Phoenix in un Progetto SaaS Commerciale

Linkly è scritto in Elixir.

Ho sempre desiderato avere esperienza con l'ecosistema Erlang, ed Elixir è una via facile.

Non tratterò qui i benefici di BEAM o Erlang direttamente, poiché ne è stato scritto altrove. Invece, mi concentrerò sugli aspetti pratici dell'utilizzo di Elixir Phoenix per un progetto reale.

Darò per scontato che sappiate cos'è Ruby on Rails, poiché Phoenix, il framework web di Elixir, è fortemente ispirato a Rails.

Programmare Effettivamente in Elixir Phoenix

Scrivere in Elixir è un'esperienza gioiosa.

Segue paradigmi simili a Rails, incluso MVC, e ha anche un aspetto simile.

A differenza di Rails, il codice viene compilato prima di essere eseguito. Questo è un passaggio utile poiché consente di individuare errori che altrimenti potreste non avere.

I modelli in Phoenix sono raggruppati in 'Contesti'. Questo è un livello extra di astrazione, inteso a creare una chiara separazione tra le parti delle applicazioni, ad esempio Utenti e Prodotti. Ogni contesto può contenere un numero qualsiasi di modelli.

Prestazioni

Si è parlato molto delle prestazioni in altri blog, quindi qui tratterò il lato pratico.

Per un framework web completo, le prestazioni sono chiaramente molto più veloci di Rails e richiedono sostanzialmente meno hardware per funzionare.

Il tempo di 'avvio' dell'esecuzione di mix phx.server rispetto a rails server è più veloce. Anche quando si sviluppa su un laptop, le pagine si caricano notevolmente più velocemente con Phoenix.

Disponibilità di Pacchetti per Elixir Phoenix vs Rails

Superficialmente, sembra che ci sia una differenza qui. Rails ha molte migliaia di gem rispetto al repository Hex di Elixir.

In realtà, quasi tutto ciò che utilizzereste è disponibile nel sistema di pacchetti Hex di Elixir - parser JSON, client HTTP, strumenti per la formattazione e l'analisi di Markdown - è tutto lì, e la qualità dei moduli è eccezionale.

In Rails, ci sono sostanzialmente più gem, ma non le includereste mai in un progetto reale, a causa del loro stato non mantenuto o del rischio associato all'inserimento di troppe dipendenze esterne nella vostra applicazione.

Piattaforme come Stripe e Recurly mantengono le proprie gem Rails per interagire con le loro API. Questo può essere utile, e generalmente manca il supporto per Elixir.

Ho scoperto, tuttavia, che era molto facile usare il pacchetto Tesla di Elixir per interagire con gli endpoint HTTP dei servizi, e alla fine ho preferito lavorare in questo modo, rispetto all'uso di gem preconfezionate, poiché è più leggero e permette di capire cosa sta accadendo.

Astrazione del Database - Ecto e ActiveRecord

Ecto non è completo come ActiveRecord.

Non è inteso per esserlo.

Ecto è un semplice wrapper del database che mappa le query del database agli oggetti Elixir.

Inizialmente, ho trovato frustrante che non funzionasse proprio come ActiveRecord.

Tuttavia, Ecto ti permette di interagire con il database in modo molto diretto, e in realtà rende la programmazione di applicazioni web molto più facile.

Con ActiveRecord, una volta che inizi a costruire query complesse, ci vuole più tempo per capire ActiveRecord che semplicemente scrivere una query come SQL.

Avendo usato entrambi, è mia conclusione che usare un wrapper del database leggero come Ecto sia più facile che usare un'astrazione pesante come ActiveRecord.

Ti dà la sicurezza di usare un wrapper del database, senza il mal di testa e il peso di un'astrazione "troppo intelligente".

Entrambi contengono funzionalità di migrazione e rollback.

Il database predefinito per i progetti Phoenix è Postgres.

Per chi usa database NoSQL, Ecto funziona con Mongo.

Ancora meglio, Ecto funziona con le funzionalità NoSQL di Postgres, permettendoti di salvare ed interrogare JSON senza bisogno di Mongo.

Autenticazione Utente

Questo è un punto in cui Elixir Phoenix è carente.

Rails ha il modulo Devise. Phoenix ha Coherence, tuttavia al momento non è mantenuto.

Se volete usare un login di base con username e password, dovrete costruire ogni passaggio. Ciò include l'hashing delle password, la logica di reset della password, le impostazioni 'ricordami' ecc.

Questo è tedioso e comporta un sostanziale rischio di sicurezza.

Ho optato per usare Auth0, che ha funzionato bene con Phoenix. Forse questa è comunque una soluzione migliore, ma sarebbe stato bello avere avuto una scelta.

Distribuzione e Hosting

Il principale host di app Phoenix è Gigalixir, una piccola azienda americana gestita da appassionati di Elixir.

Gigalixir è ospitato su Google Cloud, quindi l'infrastruttura sottostante è solida.

Il buildpack di Gigalixir rende la distribuzione facile e supporta tutte le intelligenti strategie di distribuzione di Elixir (distillery, mix).

È più costoso del 'fai-da-te', ma la maggior parte del costo è legata all'hosting del database Postgres.

Elixir Phoenix è così leggero che può essere eseguito su piccoli pod docker e gestire comunque un numero molto elevato di richieste.

Nonostante il ricarico, vale assolutamente la pena eliminare il mal di testa.

Aggiungo solo che il loro supporto clienti è eccezionale.

Disponibilità di Programmatori

Ci sono sostanzialmente meno programmatori Elixir in circolazione.

Elixir è un "linguaggio da programmatori" - un linguaggio a cui le persone arrivano, dopo aver imparato qualcos'altro.

Detto questo, coloro che usano Elixir sono tipicamente programmatori migliori. Forse è la scelta consapevole di scegliere un linguaggio migliore.

Mi ricorda i primi giorni di Rails, dove sembrava che solo i "rockstar" lo usassero (rispetto a PHP).

Qualsiasi buon programmatore Rails non avrà problemi ad imparare Elixir Phoenix, e sarà operativo in pochi giorni.

Userei di Nuovo Elixir Phoenix?

Assolutamente.

Ho lavorato con molti linguaggi, ed Elixir è il più facile e potente con cui abbia lavorato.

Non vedo l'ora di scrivere in Elixir.

Traccia 500 clic mensili con tutte le funzionalità incluse.

Non è richiesta carta di credito