Verwendung von Elixir Phoenix in einem kommerziellen SaaS-Projekt
Linkly ist in Elixir geschrieben.
Ich wollte schon immer Erfahrungen mit dem Erlang-Ökosystem sammeln, und Elixir ist ein einfacher Weg dorthin.
Ich werde hier nicht direkt auf die Vorteile von BEAM oder Erlang eingehen, da darüber bereits an anderer Stelle geschrieben wurde. Stattdessen konzentriere ich mich auf die praktischen Aspekte der Verwendung von Elixir Phoenix für ein echtes Projekt.
Ich gehe davon aus, dass Sie wissen, was Ruby on Rails ist, da Phoenix, Elixirs Web-Framework, stark von Rails inspiriert ist.
Tatsächliches Programmieren in Elixir Phoenix
Das Schreiben in Elixir ist eine freudige Erfahrung.
Es folgt ähnlichen Paradigmen wie Rails, einschließlich MVC, und sieht sogar ähnlich aus.
Anders als Rails wird der Code kompiliert, bevor er ausgeführt wird. Dies ist ein nützlicher Schritt, da er es Ihnen ermöglicht, Fehler zu erkennen, die Sie sonst möglicherweise nicht bemerkt hätten.
Modelle in Phoenix sind in 'Contexts' gruppiert. Dies ist eine zusätzliche Abstraktionsebene, die dazu gedacht ist, eine klare Trennung zwischen Teilen von Anwendungen zu schaffen, z.B. Benutzer und Produkte. Jeder Context kann eine beliebige Anzahl von Modellen enthalten.
Leistung
Viel wurde in anderen Blogs über Leistung geschrieben, daher werde ich hier die praktische Seite behandeln.
Für ein voll ausgestattetes Web-Framework ist die Leistung eindeutig viel schneller als Rails und erfordert wesentlich weniger Hardware zum Ausführen.
Die 'Startzeit' beim Ausführen von mix phx.server im Vergleich zu rails server ist schneller. Selbst bei der Entwicklung auf einem Laptop laden Seiten mit Phoenix spürbar schneller.
Verfügbarkeit von Paketen für Elixir Phoenix vs Rails
Oberflächlich betrachtet scheint es hier einen Unterschied zu geben. Rails hat viele Tausende von Gems im Vergleich zu Elixirs Hex-Repository.
Wie sich herausstellt, ist fast alles, was Sie tatsächlich verwenden würden, im Elixir Hex-Paketsystem verfügbar - JSON-Parser, HTTP-Clients, Tools zum Formatieren und Parsen von Markdown - alles ist da, und die Modulqualität ist hervorragend.
In Rails gibt es wesentlich mehr Gems, aber Sie würden sie niemals in ein echtes Projekt einbinden, aufgrund ihres nicht gewarteten Status oder des Risikos, das mit dem Einbau zu vieler externer Abhängigkeiten in Ihre Anwendung verbunden ist.
Plattformen wie Stripe und Recurly pflegen ihre eigenen Rails-Gems für die Interaktion mit ihren APIs. Dies kann praktisch sein, und die Unterstützung für Elixir fehlt im Allgemeinen.
Ich stellte jedoch fest, dass es sehr einfach war, Elixirs Tesla-Paket für die Interaktion mit HTTP-Endpunkten von Diensten zu verwenden, und bevorzugte schließlich diese Arbeitsweise gegenüber der Verwendung vorgefertigter Gems, da sie leichtgewichtiger ist und es Ihnen ermöglicht zu verstehen, was passiert.
Datenbank-Abstraktion - Ecto und ActiveRecord
Ecto ist nicht so vollständig ausgestattet wie ActiveRecord.
Das ist auch nicht beabsichtigt.
Ecto ist ein einfacher Datenbank-Wrapper, der Datenbankabfragen auf Elixir-Objekte abbildet.
Anfangs fand ich es frustrierend, dass es nicht genau wie ActiveRecord funktionierte.
Ecto ermöglicht es Ihnen jedoch, auf sehr unkomplizierte Weise mit der Datenbank zu interagieren, und macht die Programmierung von Webanwendungen tatsächlich viel einfacher.
Mit ActiveRecord dauert es länger, ActiveRecord zu verstehen, als einfach eine Abfrage als SQL zu schreiben, sobald Sie beginnen, komplexe Abfragen zu erstellen.
Nachdem ich beide verwendet habe, komme ich zu dem Schluss, dass die Verwendung eines leichtgewichtigen Datenbank-Wrappers wie Ecto einfacher ist als die Verwendung einer schwergewichtigen Abstraktion wie ActiveRecord.
Es gibt Ihnen die Sicherheit der Verwendung eines Datenbank-Wrappers, ohne die Kopfschmerzen und das Gewicht einer "zu cleveren" Abstraktion.
Beide enthalten Migrations- und Rollback-Funktionalität.
Die Standarddatenbank für Phoenix-Projekte ist Postgres.
Für diejenigen, die NoSQL-Datenbanken verwenden, funktioniert Ecto mit Mongo.
Noch besser, Ecto funktioniert mit Postgres' NoSQL-Funktionen, sodass Sie JSON speichern und abfragen können, ohne Mongo zu benötigen.
Benutzer-Authentifizierung
Dies ist ein Bereich, in dem Elixir Phoenix Nachholbedarf hat.
Rails hat das Devise-Modul. Phoenix hat Coherence, das jedoch derzeit nicht gewartet wird.
Wenn Sie einen einfachen Benutzernamen- und Passwort-Login verwenden möchten, müssen Sie jeden Schritt davon selbst erstellen. Das beinhaltet das Hashen von Passwörtern, Passwort-Reset-Logik, 'Remember-me'-Einstellungen usw.
Das ist mühsam und birgt erhebliche Sicherheitsrisiken.
Ich entschied mich für Auth0, das mit Phoenix einwandfrei funktionierte. Vielleicht ist das sowieso eine bessere Lösung, aber es wäre schön gewesen, eine Wahl gehabt zu haben.
Deployment & Hosting
Der Haupt-Host für Phoenix-Apps ist Gigalixir, ein kleines amerikanisches Unternehmen, das von Elixir-Enthusiasten betrieben wird.
Gigalixir wird auf Google Cloud gehostet, daher ist die zugrunde liegende Infrastruktur solide.
Gigalixirs Buildpack macht das Deployment einfach und unterstützt alle cleveren Deployment-Strategien von Elixir (distillery, mix).
Es ist teurer als 'selbst gemacht', aber der Großteil der Kosten entfällt auf das Postgres-Datenbank-Hosting.
Elixir Phoenix ist so leichtgewichtig, dass es auf kleinen Docker-Pods ausgeführt werden kann und dennoch eine sehr gesunde Anzahl von Anfragen bewältigt.
Trotz des Aufschlags ist es absolut lohnenswert, sich die Kopfschmerzen zu ersparen.
Ich möchte nur hinzufügen, dass ihr Kundensupport hervorragend ist.
Verfügbarkeit von Programmierern
Es gibt wesentlich weniger Elixir-Programmierer.
Elixir ist eine "Programmierersprache" - eine Sprache, zu der Menschen kommen, nachdem sie etwas anderes gelernt haben.
Abgesehen davon sind diejenigen, die Elixir verwenden, typischerweise bessere Programmierer. Vielleicht liegt es an der bewussten Entscheidung für eine bessere Sprache.
Es erinnert mich an die frühen Tage von Rails, als es schien, dass nur "Rockstars" es verwenden würden (im Vergleich zu PHP).
Jeder gute Rails-Programmierer wird keine Probleme haben, Elixir Phoenix zu erlernen, und wird innerhalb weniger Tage einsatzbereit sein.
Würde ich Elixir Phoenix wieder verwenden?
Auf jeden Fall.
Ich habe mit vielen Sprachen gearbeitet, und Elixir ist die einfachste und leistungsfähigste, mit der ich gearbeitet habe.
Ich freue mich darauf, Elixir zu schreiben.
Verfolgen Sie 500 monatliche Klicks mit allen enthaltenen Funktionen.
Keine Kreditkarte erforderlich