Model współbieżności: Erlang vs Clojure
Napiszemy program współbieżny za pomocą Clojure, który wyodrębni słowa kluczowe z ogromnej ilości przychodzących wiadomości, które będą porównywane z bazą danych.
Jeden z moich kolegów zasugerował, aby użyć Erlanga do napisania tego programu.
Tutaj chcę zwrócić uwagę na coś, że jestem nowy w programowaniu funkcyjnym, więc mam małe wątpliwości, czy clojure jest dobrym wyborem do napisania tego programu, czy bardziej nadaje się Erlang.
5 answers
Oba języki i środowiska uruchomieniowe mają różne podejścia do współbieżności:
Erlang structures programuje tyle lekkich procesów, które komunikują się między sobą. W takim przypadku prawdopodobnie będziesz mieć proces główny wysyłający zadania i dane do wielu pracowników i więcej procesów do obsługi danych wynikowych.
Clojure preferuje projekt, w którym kilka wątków udostępnia Dane i stany przy użyciu wspólnych struktur danych. Brzmi szczególnie dobrze w przypadku gdzie wiele wątków ma dostęp do tych samych danych (tylko do odczytu) i ma mały zmienny stan.
Musisz przeanalizować swoją aplikację, aby określić, który model najbardziej Ci odpowiada. Może to również zależeć od zewnętrznych narzędzi, których używasz-na przykład od zdolności bazy danych do obsługi jednoczesnych żądań.
Inną praktyczną kwestią jest to, że clojure działa na JVM, gdzie dostępnych jest wiele bibliotek open source.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 16:46:56
Naprawdę masz na myśli współbieżne czy rozproszone?
Jeśli masz na myśli współbieżne (wielowątkowe, wielordzeniowe itp.), powiedziałbym, że Clojure jest naturalnym rozwiązaniem.
- model STM Clojure jest doskonale zaprojektowany do współbieżności wielordzeniowej, ponieważ jest bardzo wydajny w przechowywaniu i zarządzaniu stanem współdzielonym między wątkami. Jeśli chcesz zrozumieć więcej, warto spojrzeć na ten doskonały film . Clojure STM pozwala na bezpieczną mutację danych przez współbieżne wątki. Erlang omija ten problem, czyniąc wszystko niezmiennym, co samo w sobie jest w porządku, ale nie pomaga, gdy naprawdę potrzebujesz wspólnego mutowalnego stanu. Jeśli chcesz współdzielonego mutowalnego stanu w Erlangu, musisz zaimplementować go za pomocą zestawu interakcji komunikatów, który nie jest ani wydajny, ani wygodny (taka jest cena modelu dzielonego typu nothing....)
- uzyskasz z natury lepszą wydajność z Clojure, jeśli jesteś w Ustawieniach równoległych na dużej maszynie, ponieważ Clojure nie polega na przekazywanie wiadomości, a tym samym komunikacja między wątkami może być znacznie bardziej wydajna.
Jeśli masz na myśli rozproszone (tj. wiele różnych maszyn współdzielących pracę w sieci, które skutecznie działają jako odizolowane procesy) to powiedziałbym, że Erlang jest bardziej naturalnym rozwiązaniem:
- niezmienny, nic-dzielony, styl przekazywania wiadomości wymusza pisanie kodu w sposób, który może być rozpowszechniany. Więc idiomatyczny Erlang automatycznie może być rozłożony na wiele maszyn i działa w rozproszonym, odpornym na uszkodzenia ustawieniu.
- Erlang jest zatem bardzo dobrze zoptymalizowany do tego przypadku użycia, więc byłby to naturalny wybór i z pewnością byłby najszybszy do pracy.
- Clojure też może to zrobić, ale będziesz musiał wykonać znacznie więcej pracy samodzielnie ( tzn. albo będziesz musiał zaimplementować lub wybrać jakąś formę rozproszonego frameworka obliczeniowego) - Clojure obecnie nie ma takiego frameworka domyślnie.
In the long mam nadzieję, że Clojure opracuje rozproszony framework obliczeniowy, który pasuje do Erlanga - wtedy możesz mieć to, co najlepsze z obu światów!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 18:18:07
Clojure to Lisp działający na Javie JVM. Erlang został zaprojektowany od podstaw, aby był wysoce odporny na uszkodzenia i współbieżny.
Uważam, że zadanie jest wykonalne w każdym z tych języków i wielu innych. Twoje doświadczenie będzie zależeć od tego, jak dobrze rozumiesz problem i jak dobrze znasz język. Jeśli jesteś nowy w obu, powiedziałbym, że problem będzie trudny, bez względu na to, który z nich wybierzesz.
Myślałeś o czymś takim jak Lucene / Solr? On świetny program do indeksowania i wyszukiwania dokumentów. Nie wiem, co" sprawdzanie krzyżowe " oznacza dla Twojego kontekstu, ale może to być dobre rozwiązanie do rozważenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 16:27:41
Moim podejściem byłoby napisanie prostego testu w każdym języku i sprawdzenie wydajności każdego z nich. Oba języki różnią się nieco od języków w stylu C i jeśli nie jesteś do nich przyzwyczajony (i nie masz zespołu, który jest do nich przyzwyczajony), możesz skończyć z koszmarem konserwacji.
Przyjrzałbym się też używaniu czegoś takiego jak Groovy 1.8. Groovy zawiera teraz Gpary, aby umożliwić przetwarzanie równoległe. Manipulacja łańcuchami i plikami w Groovy jest naprawdę bardzo łatwa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 19:59:15
-
To zależy, co masz na myśli mówiąc "ogromny".
Struny w erlang są bolesne..
Ale:
Jeśli ogromne oznacza dziesiątki rozproszonych maszyn, to idź z erlangiem i pisz pracowników w przyjaznych dla tekstu językach (python?, perl?). Będziesz miał rozproszoną warstwę na górze z wysoce współbieżnymi lokalnymi pracownikami. Każdy pracownik byłby reprezentowany przez proces Erlanga. Jeśli potrzebujesz większej wydajności, przepisz pracownika do C. w Erlang bardzo łatwo jest porozmawiać z innym języki.
Jeśli Ogromna nadal oznacza jedną silną maszynę, idź z JVM. Nie jest więc ogromny.
Jeśli huge to setki maszyn, myślę, że będziesz potrzebował czegoś mocniejszego w stylu google (bigtable, map/reduce) prawdopodobnie na stosie C++. Erlang nadal OK, jednak będziesz potrzebował dobrych programistów, aby go zakodować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 06:03:46