Node.js ou Erlang

86

J'aime vraiment ces outils en ce qui concerne le niveau de concurrence qu'ils peuvent gérer.

Erlang / OTP ressemble à une solution beaucoup plus stable mais nécessite beaucoup plus d'apprentissage et beaucoup de plongée dans le paradigme du langage fonctionnel. Et il semble qu'Erlang / OTP le rend bien meilleur en ce qui concerne les processeurs multicœurs (corrigez-moi si je me trompe).

Mais lequel dois-je choisir? Lequel est le meilleur à court et à long terme?

Mon objectif est d'apprendre un outil qui rend la mise à l'échelle de mes projets Web sous forte charge plus facile que les langages traditionnels.

user80805
la source
Vous pouvez utiliser JavaScript comme langage fonctionnel avec underscorejs.org
Todd Moses
2
@ToddMoses êtes-vous sûr d'avoir commenté la bonne question?
Flavien Volken
Pommes et oranges. Node.JS (à la base) est l'interopérabilité libevent (C) + Javascript. Erlang est une implémentation IO totalement personnalisée. Node.JS est conçu pour les applications à thread unique. Votre problème est: voulez-vous un emploi chez Facebook / Google ou voulez-vous créer un logiciel kickass.
Vans S

Réponses:

87

Je voudrais essayer Erlang. Même s'il s'agira d'une courbe d'apprentissage plus raide, vous en tirerez davantage parti puisque vous apprendrez un langage de programmation fonctionnel. De plus, comme Erlang est spécialement conçu pour créer des systèmes fiables et hautement simultanés, vous en apprendrez beaucoup sur la création simultanée de services hautement évolutifs.

Justin Ethier
la source
10
Je ne pense pas qu'Erlang soit un peu plus complexe que Javascript. Il n'y a aucun type d'héritage dans Erlang, vous êtes donc toujours sûr de la fonction que vous appelez. Il n'y a pas de conversion de type implicite dans Erlang, vous êtes donc toujours sûr des types de données que vous utilisez. Il n'y a pas d'affectation destructive, vous êtes donc toujours sûr de ne pas avoir un ancien morceau de code cassé car un nouveau code dans le rappel a changé votre état interne.
Dmitry Belyaev
51

Je ne peux pas parler pour Erlang, mais quelques choses qui n'ont pas été mentionnées à propos de node:

  • Node utilise le moteur V8 de Google pour compiler du javascript en code machine. Donc, le nœud est en fait assez rapide. C'est donc en plus des avantages de vitesse offerts par la programmation événementielle et l'io non bloquant.
  • Node a une communauté assez active. Sautez sur leur groupe IRC sur freenode et vous verrez ce que je veux dire
  • J'ai remarqué que les commentaires ci-dessus poussent Erlang sur la base qu'il sera utile d'apprendre un langage de programmation fonctionnel. Bien que je convienne qu'il est important d'élargir vos compétences et d'en obtenir une à votre actif, vous ne devriez pas baser un projet sur le fait que vous souhaitez apprendre un nouveau style de programmation.
  • D'un autre côté, Javascript est déjà dans un paradigme dans lequel vous vous sentez à l'aise d'écrire! De plus, c'est du javascript, donc lorsque vous écrivez du code côté client, il aura l'air cohérent.
  • La communauté de node a déjà pompé des tonnes de modules ! Il existe des modules pour redis, mongodb, canapé et tout le reste. Un autre bon module à examiner est Express (pensez à Sinatra pour node)

Regardez la vidéo sur le blog de Yahoo par Ryan Dahl, le gars qui a écrit node. Je pense que cela vous aidera à avoir une meilleure idée de l'endroit où se trouve le nœud et de sa destination.

Gardez à l'esprit que le nœud est toujours à un stade avancé de développement et qu'il a donc subi de nombreux changements - des changements qui ont cassé le code antérieur. Cependant, c'est supposé être à un point où vous pouvez vous attendre à ce que l'API ne change pas trop. Donc, si vous cherchez quelque chose d'amusant, je dirais que node est un excellent choix.

Jarsen
la source
26
Je pense que le moteur V8 compile JavaScript en code machine et non en assemblage.
Jonas
10
Le fait d'avoir autant de travail sur Javascript ne rend pas le langage même un peu adapté pour résoudre des problèmes complexes. Le langage lui-même est horrible avec tous ces cas spéciaux de conversion de types. Et le style de rappel où les variables sont modifiées dans des centaines d'endroits différents et l'enfer avec la recherche de l'endroit où une affectation a eu lieu.
Dmitry Belyaev
15

Je suis un programmeur Erlang de longue date, et cette question m'a incité à jeter un œil à node.js. Ça a l'air vraiment bien.

Il semble que vous deviez générer plusieurs processus pour tirer parti de plusieurs cœurs. Je ne vois rien sur la définition de l'affinité du processeur. Vous pouvez utiliser le jeu de tâches sous Linux, mais il devrait probablement être paramétré et défini dans le programme.

J'ai également remarqué que le support de la plate-forme pourrait être un peu plus faible. Plus précisément, il semble que vous deviez exécuter avec le support Cygwin pour Windows.

Ça a l'air bien.


Éditer

Node.js a maintenant un support natif pour Windows.

dsmith
la source
5
Cette réponse est un peu ancienne. À l'heure actuelle, Node est multiplateforme, pas besoin d'avoir Cygwin pour Windows. Et Node a une prise en charge intégrée de la mise en cluster dans une machine, partageant les sockets TCP.
Farid Nouri Neshat
9

Je regarde les deux mêmes alternatives que vous, gotts, pour plusieurs projets.

Jusqu'à présent, le meilleur rasoir que j'ai trouvé pour décider entre eux pour un projet donné est de savoir si j'ai besoin d'utiliser Javascript. Un système existant que je cherche à migrer est déjà écrit en Javascript, donc sa prochaine version sera probablement faite dans node.js. D'autres projets seront réalisés dans un framework Web Erlang car il n'y a pas de base de code existante à migrer.

Une autre considération est qu'Erlang évolue bien au-delà de simples cœurs multiples, il peut évoluer vers un centre de données entier. Je ne vois pas de mécanisme intégré dans node.js qui me permette d'envoyer un message à un autre processus JS sans me soucier de la machine sur laquelle il se trouve, mais il est intégré directement à Erlang aux niveaux les plus bas. Si votre problème n'est pas assez important pour nécessiter plusieurs machines ou s'il ne nécessite pas plusieurs processus coopérants, cet avantage n'a probablement pas d'importance, vous devez donc l'ignorer.

Erlang est en effet une piscine profonde dans laquelle plonger. Je suggérerais d'écrire un programme fonctionnel autonome avant de commencer à créer des applications Web. Une première étape encore plus simple, puisque vous semblez à l'aise avec Javascript, consiste à essayer de programmer JS dans un style plus fonctionnel. Si vous utilisez jQuery ou Prototype, vous avez déjà commencé ce chemin. Essayez de rebondir entre la programmation fonctionnelle pure dans Erlang ou l'un de ses parents (Haskell, F #, Scala ...) et JS fonctionnel.

Une fois que vous êtes à l'aise avec la programmation fonctionnelle, recherchez l'un des nombreux frameworks Web Erlang; vous ne devriez probablement pas écrire votre application directement sur quelque chose de bas niveau comme inetsà ce stade avancé. Regardez quelque chose comme l' azote , par exemple.

Warren Young
la source
Il n'est souvent pas mentionné que le point «Erlang évolue vers un centre de données complet» a des prises très importantes à prendre en compte (la sécurité est une question importante). Consultez le chapitre à ce sujet ici: Learnyousomeerlang.com/distribunomicon
jocull
9

Alors que je choisirais personnellement Erlang, j'admets que je suis un peu partial contre JavaScript. Mon conseil est que vous évaluez quelques points:

  1. Réutilisez-vous du code existant dans l'un ou l'autre de ces langages (à la fois en termes de code source et d'expérience de programmeur!)
  2. Avez-vous besoin / voulez-vous des mises à jour à la volée sans arrêter l'application (c'est là qu'Erlang gagne par défaut - son exécution a été conçue pour ce cas, et OTP contient tous les outils nécessaires)
  3. Quelle est la taille du trafic attendu, en termes d'opérations distinctes et simultanées, et non de bande passante?
  4. Dans quelle mesure les opérations que vous effectuez pour chaque demande sont-elles «parallèles»?

Erlang a vraiment affiné la concurrence et le système distribué parallèle transparent au réseau. En fonction de la nature exacte du projet, la disponibilité d'une implémentation mature d'un tel système pourrait l'emporter sur tout problème concernant l'apprentissage d'une nouvelle langue. Il existe également deux autres langages qui fonctionnent sur Erlang VM que vous pouvez utiliser, le Reia de type Ruby / Python et l' Erlang à saveur de lisp .

Encore une autre option est d'utiliser les deux, en particulier avec Erlang étant utilisé comme une sorte de "hub". Je ne sais pas si Node.js a un système d'interface de fonction étrangère, mais si c'est le cas, Erlang a une bibliothèque C pour que les processus externes s'interfacent avec le système comme tout autre processus Erlang.

PL
la source
Selon la documentation, Node.js peut exploiter C et C ++ pour des addons externes. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice
On dirait que Reia est morte, mais à sa place se trouve l' élixir ... cela me rappelle Groovy et Java; ici ce serait Elixir et Erlang.
stommepoes
@EvanPlaice - Cela ne m'impressionne pas beaucoup. Le fait est que vous codez fondamentalement une chose problématique en C ++ et que vous les ajoutez en tant que composants intégrés. Ce n'est pas vraiment un FFI que vous faites étendre l'émulateur. (D'accord, préférence personnelle;)) La bibliothèque externe mentionnée dans le cas d'erlang est de créer des processus asynchrones dans d'autres langages qui apparaissent comme des nœuds OU qui parlent sur un port ouvert (pensez à un tuyau bidirectionnel, avec des données structurées). Tout cela s'intègre parfaitement dans le mode de fonctionnement asynchrone. Il y a aussi des NIF, qui sont essentiellement ce que Node.js a, mais qui sont déconseillés.
p_l
1
@p_l D'après ce que je comprends, l'approche des nœuds est légèrement différente. Alors que node est très bon pour gérer les appels d'E / S asynchrones (c'est-à-dire les requêtes Web), il s'exécute dans un environnement à un seul thread. C'est donc excellent pour la répartition, mais pas si bon pour le traitement intensif en CPU. Pour couvrir ce terrain, vous pouvez créer un autre processus / thread qui exécute du code C / C ++ natif. Si vous ne faites que des appels d'E / S asynchrones (ex IPC | tubes bidirectionnels), node.js devrait être capable de gérer la charge. Tant qu'il n'est pas codé pour passer beaucoup de temps à attendre des appels synchrones.
Evan Plaice
5

Il semble qu'Erlang fonctionne mieux pour un déploiement dans un serveur relativement bas de gamme (machine virtuelle AMD 512 Mo 4 cœurs à 2,4 GHz). Cela vient de l'expérience de SyncPad de comparer les implémentations Erlang et Node.js de leur application serveur de tableau blanc virtuel.

adib
la source
2
Oui, node.js semble avoir un vilain problème de fuite de mémoire. Node est plutôt nouveau et expérimental et ni JavaScript ni le moteur V8 n'ont été conçus pour de tels scénarios de serveur. Erlang, d'autre part, a été conçu juste pour cela de bas en haut et a eu de nombreuses années pour se raffiner et mûrir.
Rolf
2
Ce lien semble mort mais le voici sur WayBackMachine web.archive.org/web/20120902014555/http
//blog.mysyncpad.com
4

Il y a une autre langue sur la même VM que Erlang -> Elixir

C'est une alternative très intéressante à Erlang, regardez celle-ci.

Il dispose également d'un cadre Web à croissance rapide basé sur celui-ci-> Phoenix Framework

NoDisplayName
la source
0

Je préférerai Erlang à Node. Si vous voulez la concurrence, Node peut être remplacé par Erlang ou Golang en raison de leurs processus légers.

Erlang n'est pas facile à apprendre et nécessite donc beaucoup d'efforts, mais sa communauté est active et peut donc obtenir de l'aide, ce n'est que la raison pour laquelle les gens préfèrent Node.

Sumit Pugalia
la source