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.

Author: Peer Stritzinger, 2011-06-05

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.

 45
Author: nimrodm,
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!

 58
Author: mikera,
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.

 8
Author: duffymo,
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.

 0
Author: Fortyrunner,
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ć.

 -4
Author: user425720,
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