Użycie Elixir Phoenix w komercyjnym projekcie SaaS
Linkly jest napisany w Elixir.
Zawsze chciałem zapoznać się z ekosystemem Erlang, a Elixir jest łatwą drogą.
Nie będę tutaj bezpośrednio omawiał korzyści z BEAM czy Erlang, ponieważ zostało to opisane gdzie indziej. Zamiast tego skupię się na praktycznych aspektach używania Elixir Phoenix w prawdziwym projekcie.
Zakładam, że wiesz, czym jest Ruby on Rails, ponieważ Phoenix, framework webowy Elixir, jest mocno zainspirowany Rails.
Faktyczne programowanie w Elixir Phoenix
Pisanie w Elixir to radosne doświadczenie.
Podąża za podobnymi paradygmatami jak Rails, w tym MVC, i nawet wygląda podobnie.
W przeciwieństwie do Rails, kod jest kompilowany przed uruchomieniem. Jest to przydatny krok, ponieważ pozwala wyłapać błędy, których inaczej mogłoby się nie zauważyć.
Modele w Phoenix są grupowane w 'Konteksty'. Jest to dodatkowy poziom abstrakcji, mający na celu stworzenie wyraźnego rozdzielenia między częściami aplikacji, np. Użytkownicy i Produkty. Każdy kontekst może zawierać dowolną liczbę modeli.
Wydajność
Wiele napisano o wydajności na innych blogach, więc omówię tutaj praktyczną stronę.
Jak na w pełni funkcjonalny framework webowy, wydajność jest wyraźnie znacznie szybsza niż Rails i wymaga znacznie mniejszej ilości sprzętu do działania.
Czas 'uruchamiania' komendy mix phx.server w porównaniu do rails server jest krótszy. Nawet podczas pracy na laptopie, strony ładują się zauważalnie szybciej z Phoenix.
Dostępność pakietów dla Elixir Phoenix vs Rails
Powierzchownie wydaje się, że jest tutaj różnica. Rails ma wiele tysięcy gemów w porównaniu do repozytorium Hex Elixir.
Jak się okazuje, prawie wszystko, czego faktycznie można użyć, jest dostępne w systemie pakietów Elixir Hex - parsery JSON, klienty HTTP, narzędzia do formatowania i parsowania Markdown - wszystko tam jest, a jakość modułów jest znakomita.
W Rails jest znacznie więcej gemów, ale nigdy nie włączyłbyś ich do prawdziwego projektu, ze względu na ich nie utrzymywany status lub ryzyko związane z budowaniem zbyt wielu zewnętrznych zależności w aplikacji.
Platformy takie jak Stripe i Recurly utrzymują własne gemy Rails do interakcji z ich API. Może to być pomocne, a generalnie brakuje wsparcia dla Elixir.
Odkryłem jednak, że bardzo łatwo było użyć pakietu Tesla w Elixir do interakcji z endpointami HTTP usług, i ostatecznie wolałem pracować w ten sposób, niż używać gotowych gemów, ponieważ jest to lżejsze i pozwala zrozumieć, co się dzieje.
Abstrakcja bazy danych - Ecto i ActiveRecord
Ecto nie jest tak w pełni funkcjonalne jak ActiveRecord.
Nie jest to zamierzone.
Ecto to prosty wrapper bazy danych, który mapuje zapytania bazodanowe na obiekty Elixir.
Początkowo było to dla mnie frustrujące, że nie działało tak jak ActiveRecord.
Jednak Ecto pozwala wchodzić w interakcję z bazą danych w bardzo prosty sposób i faktycznie znacznie ułatwia programowanie aplikacji webowych.
Z ActiveRecord, gdy zaczynasz budować złożone zapytania, dłużej trwa zgłębienie ActiveRecord niż po prostu napisanie zapytania jako SQL.
Po użyciu obu, doszedłem do wniosku, że używanie lekkiego wrappera bazy danych jak Ecto jest łatwiejsze niż używanie ciężkiej abstrakcji jak ActiveRecord.
Daje bezpieczeństwo używania wrappera bazy danych, bez bólu głowy i ciężaru „zbyt mądrej" abstrakcji.
Oba zawierają funkcjonalność migracji i wycofywania.
Domyślną bazą danych dla projektów Phoenix jest Postgres.
Dla tych, którzy używają baz danych NoSQL, Ecto działa z Mongo.
Co więcej, Ecto działa z funkcjami NoSQL Postgres, pozwalając zapisywać i odpytywać JSON bez potrzeby używania Mongo.
Uwierzytelnianie użytkownika
To jest miejsce, w którym Elixir Phoenix brakuje.
Rails ma moduł Devise. Phoenix ma Coherence, jednak obecnie nie jest utrzymywany.
Jeśli chcesz użyć podstawowego logowania za pomocą nazwy użytkownika i hasła, będziesz musiał zbudować każdy krok tego procesu. Obejmuje to hashowanie haseł, logikę resetowania hasła, ustawienia 'pamiętaj mnie' itp.
Jest to żmudne i niesie znaczne ryzyko bezpieczeństwa.
Zdecydowałem się użyć Auth0, który działał z Phoenix bez problemu. Być może jest to lepsze rozwiązanie, ale byłoby miło mieć wybór.
Wdrożenie i hosting
Głównym hostem aplikacji Phoenix jest Gigalixir, mała amerykańska firma prowadzona przez entuzjastów Elixir.
Gigalixir jest hostowany w Google Cloud, więc podstawowa infrastruktura jest solidna.
Buildpack Gigalixir ułatwia wdrożenie i obsługuje wszystkie sprytne strategie wdrażania Elixir (distillery, mix).
Jest droższy niż 'zrób to sam', ale większość kosztów jest związana z hostingiem bazy danych Postgres.
Elixir Phoenix jest tak lekki, że może działać na małych podach dockera i nadal obsługiwać bardzo dużą liczbę żądań.
Pomimo narzutu, absolutnie warto to zrobić, aby pozbyć się bólu głowy.
Dodam tylko, że ich obsługa klienta jest znakomita.
Dostępność programistów
Jest znacznie mniej programistów Elixir.
Elixir to "język programistów" - język, do którego ludzie przychodzą, nauczywszy się czegoś innego.
Mówię to, ci którzy używają Elixir są zazwyczaj lepszymi programistami. Może to świadomy wybór lepszego języka.
Przypomina mi to wczesne dni Rails, gdzie wydawało się, że tylko "gwiazdy rocka" by go używały (w porównaniu do PHP).
Każdy dobry programista Rails bez problemu opanuje Elixir Phoenix i będzie gotowy do pracy w ciągu kilku dni.
Czy użyłbym Elixir Phoenix ponownie?
Zdecydowanie.
Pracowałem z wieloma językami, a Elixir jest najłatwiejszym i najpotężniejszym, z którym pracowałem.
Nie mogę się doczekać pisania w Elixir.
Śledź 500 miesięcznych kliknięć ze wszystkimi funkcjami.
Nie potrzebujesz karty kredytowej