Jak wypada akka w porównaniu do Erlang? [Zamknięte]

97

Ostatnio oglądałem akka i robi wrażenie. Wygląda na to, że ma większość zabójczych cech erlang - przejrzystość lokalizacji, hierarchie nadzoru i nie tylko. Czy są jakieś cechy Erlanga, których Akka nie ma?

ryeguy
źródło
Obejrzyj ten film o erlangu w praktyce. Szkoda, że ​​nie ma nic o
scali

Odpowiedzi:

123

Zastrzeżenie: jestem PO dla Akka

  • Erlang wykonuje kopiowanie przy wysyłaniu - Akka używa pamięci współdzielonej (niezmiennych obiektów) do wysyłania w maszynach wirtualnych
  • Erlang wykonuje GC dla poszczególnych procesów - Akka używa GC JVM
  • Erlang ma OTP - Akka integruje się z całym ekosystemem Java (Apache Camel, JAX-RS itp.)
  • Erlang wykonuje harmonogramowanie procesów za Ciebie - Akka umożliwia korzystanie z wielu różnych dyspozytorów z nieograniczonymi możliwościami konfiguracji
  • Erlang przeładowuje kod na gorąco - Akka może go obsługiwać, ale jest mniej elastyczny ze względu na ładowanie klas JVM

To te z czubka mojej głowy.

Z drugiej strony, używanie Akki oznacza, że ​​do pisania aplikacji możesz używać Scali, Java, Groovy lub JRuby.

Viktor Klang
źródło
39
Obiekty Erlang są również niezmienne, a model współbieżności nie wymaga kopiowania przy wysyłaniu w tym samym węźle. BEAM dla dużych obiektów wysyła odniesienie. Źródło: ta odpowiedź SO autorstwa @rvirdig .
FooF
26
Erlang wykonuje kopiowanie przy wysyłaniu, aby zwiększyć wydajność GC - może działać na podstawie procesu. Dlatego w aplikacjach Erlang nie ma dużych przerw w GC w przeciwieństwie do aplikacji JVM / Akka.
andreypopp
4
Cóż, Andrey, to zależy od tego, której JVM / GC używasz. azulsystems.com/products/zing/whatisit
Viktor Klang
4
Erlang ma zmniejszoną liczbę dla każdego procesu, nawet jeśli jesteś w zajętej pętli obliczeniowej, Erlang VM może wstrzymać proces i pozwolić innym głodnym procesom zająć więcej cykli procesora. To bardzo ważna funkcja, której JVM nie zapewnia.
Daniel
6
@MaX Erlang jest często 5x wolniejszy niż Java z powodu braku obsługi JIT. Ale Erlang nie ma pauzy GC, jest przeznaczony do zastosowań telekomunikacyjnych w trybie współbieżności i 7 * 24, Erlang koncentruje się bardziej na uczciwości procesu, unikaniu głodu i impasu, nie jest przeznaczony do przepustowości jak JVM. Więc jest naprawdę pomarańczowy i jabłkowy.
Daniel
74

W procesach Erlang gwarantuje się przełączanie mniej więcej co 1000 redukcji. W tak naiwnym frameworku jak Scala / Akka agent jest właścicielem harmonogramu, dopóki nie zakończy pracy w odbiorze. Szach mat. Koniec gry. Hasta la vista :) Ludzie, nie traćcie czasu na pseudotechnologię. Zszokowałem, że faceci tutaj porównują Scalę z Erlangiem.

Jest też wiele innych tak zwanych „zabójczych funkcji”, ale oto moja rada, nie myśl w kategoriach funkcji, myśl o idiomach, które umożliwiają dany język. Scala kradnie „najlepsze funkcje”, Erlang umożliwia / implementuje odpowiednie idiomy, aby niezawodnie budować systemy, używając języka wysokiego poziomu, który jest oparty na tych właściwych idiomach. Kiedy uczysz się Erlang, odbudowujesz swój umysł, swój sposób myślenia o niezawodnym systemie rozproszonym, Erlang uczy Cię i ulepsza. Scala to kolejny imperatywny (och, przepraszam, wieloparadygmatyczne, zabawne słowo) język, który próbuje ukraść dobre cechy innym językom.

vjache
źródło
9
Sposób Erlanga na uczynienie wszystkich operacji we / wy niejawnie asynchronicznymi jest bardzo elegancki. Async IO można zrobić za pomocą NIO API w Scali, co dla mnie nie wygląda jak check-mate, ale jest mniej eleganckim rozwiązaniem.
HRJ,
7
o czym ty do diabła mówisz ?! w jaki sposób przetwarzanie 1000 prostych zadań jest lepsze niż planowanie w trybie roundrobin, a nawet w pobliżu planowania najmniejszej skrzynki pocztowej!
FUD
8
@vjache - zgadzam się. Wiele lat pracy jako programista Java nauczyło mnie, że w pewnym momencie będziesz musiał zbadać warstwę pod tobą. Scala / Akka wydaje się być tylko kolejną warstwą na wielu innych warstwach (np. Nio, netty itp.), Z których wszystkie będziesz musiał kiedyś zrozumieć. Chociaż dopiero zacząłem pracować z Erlangiem, wygląda na to, że będę miał mniej warstw, które muszę zrozumieć, aby wykonać zadanie. Rozproszone programowanie w Erlangu wydaje się znacznie lżejsze dla Scala / Akka, prawdopodobnie w podobny sposób, w jaki Python był lżejszą alternatywą dla Java dla aplikacji internetowych.
Chris Snow
@FUD: może miał na myśli 1000 instrukcji Erlanga? nie mógł mieć na myśli 1000 wiadomości ...
Erik Kaplun
2
@ErikAllik Miał na myśli 1000 „redukcji”. Pomyśl o redukcji jako o tokenie do wykonania kawałka kodu (nie jest, ale spełnia zadanie wyjaśniania ...). Po 1000 redukcji program planujący przełącza się na inny proces. Więcej informacji na erlang.org/pipermail/erlang-questions/2001-April/003132.html
Aegis
40

Prawie nikt nie wspomina o izolacji procesu. Bez gwarancji, że "twój wątek nie może zepsuć moich śmieci", systemy rozproszone są znacznie trudniejsze do rozważenia. (Są już wystarczająco trudne z procesami Erlanga).

AFAIK (co nie jest daleko, biorąc pod uwagę moje ograniczone bezpośrednie doświadczenie z JVM), tylko Erlang faktycznie uzyskuje „właściwą” izolację procesów w JVM. Pan Google może dać kilka wskazówek, gdzie szukać badań Foxa i Candei (?) Na temat systemów badawczych wykorzystujących technikę „mikro-ponownego uruchomienia” („przetwarzanie zorientowane na odzyskiwanie”). Programista Erlang czyta te badania i mówi kilka rzeczy:

  1. Witamy w klubie, czemu zajęło ci tyle czasu?
  2. Jednak JVM bardzo utrudnia dołączenie. :-)
Scott Lystig Fritchie
źródło
Izolacja procesu jest rzeczywiście super przyjemna. Jednak nawet Erlang nie jest odporny na niepowodzenie NIF.
Viktor Klang
14

Dla mnie podmiana gorącego kodu w całym klastrze Erlang bez przestojów (na przykład make:all([netload]:) jest jedną z zabójczych funkcji Erlang.

Ale odwróćmy pytanie: co ma akka, czego nie ma Erlang? Oczywiście możesz dodać dziesiątki rozszerzeń i bibliotek (scala, akka, spring, osgi, ...) do Javy, aby spróbować zbliżyć się do Erlanga. Ale o co chodzi? Podsumowując, wszystkie te rozszerzenia są znacznie bardziej złożone niż nauka prostego języka Erlang, który od ponad dwóch dekad udowadnia, że ​​może wykonać swoją pracę, oferując najwyższą skalowalność bez przestojów.

Rumpelstilz
źródło
30
IMO, Scala jest znacznie lepszym językiem na poziomie składni niż Erlang. Ma obiekty, cechy, odpowiednie przestrzenie nazw, właściwe bezpieczeństwo typów, brak brzydkiej składni rekordów itp. Społeczność jest większa, mogę używać wszystkich dostępnych narzędzi Java i po prostu czuję się bardziej dopracowana.
ryeguy
15
@ryeguy: "lepszy język na poziomie składni" ... hmm, zdefiniuj "lepszy" dla "składni". Kiedy porównuję języki, składnia jest najbardziej nieistotnym czynnikiem (ponieważ jest to tylko kwestia gustu lub tego, czego się używasz).
Peer Stritzinger
4
@ryeguy Inna semantyka, inna składnia.
rvirding
3
wymiana kodu na gorąco staje się uciążliwa, jeśli chcesz zachować stan między różnymi wersjami kodu, w końcu łatwiej jest zamknąć proces i migrować stan podczas uruchamiania
OlegYch
4
@ryeguy Składnia języka programowania jest prawie nieistotna; liczy się jego semantyka. Erlang to funkcjonalny PL, więc oczywiście nie ma obiektów. Cechy, bezpieczeństwo typów itp. Wynikają z tego, że Scala jest językiem silnie typizowanym, podczas gdy Erlang jest typowany dynamicznie; to jest wybór projektu. Niemniej jednak zapraszam do zapoznania się z Elixirem, jeśli chcesz, aby zalety Erlanga były bardziej nowoczesne;)
Aegis
5

Prawdopodobnie Erlang jest lepszy dla większych systemów rozproszonych (zgodnie z odpowiedzią vjache), ale dla normalnego serwera, gdy chcesz po prostu wykorzystać pełną moc wielu procesorów, Akka jest dobrym wyborem - zapewnia dobrą abstrakcję, wydajność i integrację z ekosystemem Java.

kodstark
źródło