La simultanéité modèle: Erlang vs Clojure
Nous allons écrire un programme concurrent à l'aide de Clojure, qui va extraire des mots-clés à partir d'un grand nombre de messages entrants qui seront recoupées avec une base de données.
Un de mes coéquipiers a suggéré d'utiliser Erlang pour écrire ce programme.
Ici, je tiens à souligner quelque chose que je suis de nouveau à la programmation fonctionnelle, donc je suis dans un petit doute si clojure est un bon choix pour l'écriture de ce programme, ou Erlang est plus approprié.
- N'était pas la manipulation des chaînes de Erlang sous-optimale? (Pour éviter la simultanéité des discussions...)
- La manipulation des chaînes en Erlang n'est sous-optimale si vous avez un mauvais usage, à mon avis. Travailler avec des fichiers binaires est très efficace, par exemple.
- Erlang est bizarre syntaxe: damienkatz.net/2008/03/what_sucks_abou.html
- Il est surprenant de constater que Erlang est bizarre syntaxe serait un argument venant de quelqu'un qui est un fan de Lisps (qui, je suppose puisqu'il s'agit d'Erlang vs Clojure). Les deux ont des inconnus syntaxes qui peuvent tenir leur propre, tout en étant totalement méprisé par beaucoup de gens. L'élégance est dans l'œil de celui qui regarde et je voudrais ne jamais être surpris de trouver des dizaines de programmeurs qui pense que les deux langues look terrible (je tourne avec deux lisps et Erlang).
Vous devez vous connecter pour publier un commentaire.
Les deux langues et exécutions prendre différentes approches de la concurrence:
Erlang structures de programmes, comme de nombreux processus légers de la communication entre l'un de l'autre. Dans ce cas, vous aurez probablement un processus maître de l'envoi des emplois et des données à de nombreux travailleurs et de plus les processus pour gérer les données qui en résultent.
Clojure favorise une conception où plusieurs threads de partager des données et de l'état en utilisant les structures de données communes. Il semble particulièrement adapté pour les cas où le nombre de threads ont accès aux mêmes données (en lecture seule) et de partager peu mutable état.
Vous avez besoin d'analyser votre demande de déterminer le modèle qui vous convient le mieux. Cela peut également dépendre de l'utilisation d'outils externes que vous utilisez (par exemple, la capacité de la base de données pour gérer les demandes simultanées.
Un autre aspect que clojure tourne sur la JVM, où de nombreuses bibliothèques open source sont disponibles.
Pensez-vous vraiment dire parallèles ou distribuées?
Si vous voulez dire simultanées (multi-thread, multi-core, etc.), je dirais ensuite que Clojure est la solution naturelle.
Si tu parles de la distribution (c'est à dire de nombreuses machines de partage sur un réseau qui sont effectivement en cours d'exécution en tant que processus isolés), alors je dirais Erlang est la solution la plus logique:
Dans le long terme, j'espère que Clojure développe une informatique distribuée cadre qui correspond à Erlang - alors vous pouvez avoir le meilleur des deux mondes!
Clojure est Lisp en cours d'exécution sur le Java JVM. Erlang est conçu à partir du sol pour être très à tolérance de pannes simultanées.
Je crois que la tâche est faisable avec l'une de ces langues et de nombreux autres. Votre expérience dépendra de la façon dont vous comprenez le problème et comment bien vous savez la langue. Si vous êtes nouveau à la fois, je dirais que le problème sera difficile, peu importe celle que vous choisissez.
Avez-vous pensé à quelque chose comme Lucene/Solr? C'est un excellent logiciel pour l'indexation et la recherche de documents. Je ne sais pas ce que "la contre-vérification" désigne, pour votre contexte, mais ce pourrait être une bonne solution à envisager.
Mon approche serait d'écrire un test simple dans chaque langue et de tester la performance de chacun. Les deux langues sont quelque peu différents de style C langues et si vous n'êtes pas habituer (et vous n'avez pas une équipe qui est utilisé pour eux) vous pouvez vous retrouver avec un entretien cauchemar.
Je voudrais aussi regarder en utilisant quelque chose comme Groovy 1.8. Groovy comprend maintenant GPars pour permettre le calcul parallèle. Chaîne et de manipulation de fichiers en Groovy est très facile en effet.
mais:
Si d'énormes moyens des dizaines de machines réparties, que d'aller avec erlang et écrire des travailleurs dans le texte convivial langages (python?, perl?). Vous aurez distribué couche sur le dessus avec très concurrente des travailleurs locaux. Chaque travailleur devrait être représenté par erlang processus. Si vous avez besoin de plus de performance, de réécrire votre travailleur en C. En Erlang c'est super facile de parler d'autres langues.
Si énorme signifie toujours une forte machine aller à la JVM. Ce n'est pas énorme alors.
Si énorme est des centaines de machines, je pense que vous aurez besoin de quelque chose de plus fort, comme sur google (bigtable, map/reduce) probablement sur le C++ de la pile. Erlang encore OK, cependant, vous aurez besoin de bons devs de ce code.