Comment Akka s'en sort face à Erlang? [fermé]


97

J'ai regardé akka récemment et c'est assez impressionnant. Il semble qu'il possède la plupart des fonctionnalités phares d'erlang - transparence de l'emplacement, hiérarchies de supervision, etc. Y a-t-il des fonctionnalités qu'Erlang a que Akka n'a pas?


Regardez ce film sur l'erlang en pratique. Dommage qu'il n'y en ait pas à propos de scala youtube.com/watch?v=G0eBDWigORY
mhstnsc

Réponses:


123

Clause de non-responsabilité: je suis le PO d'Akka

  • Erlang effectue une copie lors de l'envoi - Akka utilise la mémoire partagée (objets immuables) pour les envois in-VM
  • Erlang fait un GC par processus - Akka utilise des GC JVM
  • Erlang a OTP - Akka s'intègre à tout l'écosystème Java (Apache Camel, JAX-RS, etc.)
  • Erlang s'occupe de la planification des processus pour vous - Akka vous permet d'utiliser de nombreux répartiteurs différents avec des possibilités de configuration infinies
  • Erlang effectue le rechargement du code à chaud - Akka peut le prendre en charge, mais il est moins flexible en raison du chargement de classe JVM

Ce sont ceux du haut de ma tête.

D'autre part, utiliser Akka signifie que vous pouvez utiliser Scala, Java, Groovy ou JRuby pour écrire vos applications.


39
Les objets Erlang sont également immuables et le modèle de concurrence ne nécessite pas de copie à l'envoi dans le même nœud. BEAM pour les grands objets envoie une référence. Source: cette réponse SO de @rvirdig .
FooF

26
Erlang effectue une copie sur envoi pour rendre GC plus efficace - il peut fonctionner par processus. C'est pourquoi il n'y a pas d'énormes pauses GC dans les applications Erlang par opposition aux applications JVM / Akka.
andreypopp

4
Eh bien, Andrey, cela dépend de la JVM / GC que vous utilisez. azulsystems.com/products/zing/whatisit
Viktor Klang

4
Erlang a un nombre de réduction pour chaque processus, même si vous êtes dans une boucle de calcul lourde et occupée, Erlang VM peut suspendre le processus et laisser d'autres processus affamés prendre plus de cycles de processeur. C'est une fonctionnalité très importante que JVM ne fournit pas.
Daniel

6
@MaX Erlang est souvent 5 fois plus lent que Java en raison du manque de support JIT. Mais Erlang n'a pas de pause GC, il est conçu pour la concurrence et les applications de télécommunications 7 * 24, Erlang se préoccupe davantage de l'équité des processus, évitant la famine et l'impasse, il n'est pas conçu pour un débit comme JVM. Donc, c'est vraiment orange et pomme.
Daniel

74

Dans Erlang, les processus sont garantis pour être commutés environ toutes les 1000 réductions. Dans un cadre aussi naïf que l'agent Scala / Akka possède un planificateur jusqu'à ce qu'il termine son travail en réception. Échec et mat. Jeu terminé. Hasta la vista :) Les gens, ne perdez pas votre temps sur des pseudo-techs. J'ai choqué que les gars ici comparent Scala à Erlang.

Il existe également de nombreuses autres fonctionnalités dites "tueuses", mais voici mon conseil, ne pensez pas en termes de fonctionnalités, pensez aux idiomes qui permettent un langage particulier. Scala vole les "meilleures fonctionnalités", Erlang vous permet / implémente avec les bons idiomes pour construire des systèmes de manière fiable, avec un langage de haut niveau qui conduit à ces bons idiomes. Lorsque vous apprenez Erlang, vous reconstruisez votre esprit, votre façon de penser au système fiable distribué, Erlang vous apprend et vous met à niveau. Scala est juste un autre langage impératif (oh, désolé, multiparadigmal, mot drôle) qui essaie de voler de bonnes fonctionnalités à d'autres langues.


9
La manière Erlang de rendre tous les E / S implicitement asynchrones est très élégante. Async IO peut être fait en utilisant les API NIO dans Scala, ce qui ne me ressemble pas à un check-mate, mais à une solution moins élégante.
HRJ

7
de quoi diable parlez-vous?! comment le traitement de 1000 tâches simples est-il meilleur qu'une planification roundrobin, ou même près d'une planification de la plus petite boîte aux lettres !!
FUD

8
@vjache - Je suis d'accord. Mes nombreuses années en tant que programmeur java m'ont appris que vous devrez à un moment donné étudier la couche en dessous de vous. Scala / Akka semble être juste une autre couche au-dessus de beaucoup d'autres couches (par exemple, nio, netty, etc.), que vous aurez besoin de comprendre à un moment donné. Même si je viens de commencer à travailler avec Erlang, il semble que j'aurai moins de couches que je dois comprendre pour faire le travail. La programmation distribuée dans Erlang semble beaucoup plus légère que Scala / Akka, probablement de la même manière que python était l'alternative plus légère à Java pour les applications Web.
Chris Snow

@FUD: peut-être qu'il voulait dire 1000 instructions Erlang? il n'aurait pas pu signifier 1000 messages ...
Erik Kaplun

2
@ErikAllik Il voulait dire 1000 "réductions". Pensez à une réduction comme un jeton pour exécuter un peu de code (ce n'est pas le cas, mais cela fait le travail d'expliquer ...). Après 1 000 réductions, le planificateur passe à un processus différent. Plus d'infos sur erlang.org/pipermail/erlang-questions/2001-April/003132.html
Aegis

40

Presque personne ne mentionne l'isolement des processus. Sans garanties de "votre thread ne peut pas jouer avec mes déchets", les systèmes distribués sont beaucoup plus difficiles à raisonner. (Ils sont déjà assez difficiles avec les processus d' Erlang.)

AFAIK (ce qui n'est pas loin, compte tenu de mon expérience directe limitée avec la JVM), seul Erlang obtient réellement l'isolation des processus «correctement» sur la JVM. M. Google peut donner quelques indices sur les recherches de Fox et Candea (?) Sur les systèmes de recherche qui utilisent une technique de "micro-redémarrage" ("calcul orienté récupération"). Un développeur Erlang lit cette recherche et dit deux ou trois choses:

  1. Bienvenue au club, qu'est-ce qui vous a pris si longtemps?
  2. La JVM le rend terriblement difficile à rejoindre, cependant. :-)

L'isolation des processus est en effet super sympa. Cependant, même Erlang n'est pas à l'abri d'un NIF qui a mal tourné.
Viktor Klang

14

Pour moi, échange de code à chaud dans un cluster Erlang entier sans temps d'arrêt (par exemple: make:all([netload] est l'une des fonctionnalités du tueur d'Erlang.

Mais inversons votre question: qu'est-ce que akka a qu'Erlang n'a pas? Bien sûr, vous pouvez ajouter des dizaines d'extensions et de bibliothèques (scala, akka, spring, osgi, ...) à Java pour essayer de vous rapprocher d'Erlang. Mais où est le point? En résumé, toutes ces extensions sont beaucoup plus complexes que l'apprentissage du simple langage Erlang qui a prouvé depuis plus de 2 décennies qu'il peut faire le travail en offrant une évolutivité maximale sans temps d'arrêt.


30
OMI, Scala est un langage bien meilleur au niveau de la syntaxe qu'Erlang. Il a des objets, des traits, des espaces de noms appropriés, une sécurité de type appropriée, aucune syntaxe d'enregistrement laide, etc. La communauté est plus grande, je peux utiliser tous les outils Java disponibles et cela me semble plus raffiné.
ryeguy

15
@ryeguy: "meilleur langage au niveau de la syntaxe" ... hmm, définissez "mieux" pour "syntaxe". Quand je compare les langues, la syntaxe est le facteur le plus hors de propos (car ce n'est qu'une question de goût ou de ce à quoi vous êtes habitué).
Peer Stritzinger

4
@ryeguy Sémantique différente, syntaxe différente.
rvirding

3
l'échange de code à chaud devient une douleur si vous devez maintenir l'état entre différentes versions de code, à la fin, il est plus facile d'arrêter le processus et de migrer l'état au démarrage
OlegYch

4
@ryeguy La syntaxe d'un langage de programmation est presque sans importance; ce qui compte, c'est sa sémantique. Erlang est un PL fonctionnel donc bien sûr il n'a pas d'objets. Les traits, la sécurité de type, etc. sont dus au fait que Scala est un langage fortement typé, tandis qu'Erlang est typé dynamiquement; c'est un choix de conception. Néanmoins, je vous invite à jeter un œil à Elixir si vous voulez les avantages d'Erlang avec une sensation plus moderne;)
Aegis

5

Erlang est probablement meilleur pour les systèmes distribués plus volumineux (suite à la réponse de vjache) mais pour un serveur normal, lorsque vous souhaitez simplement utiliser toute la puissance de plusieurs processeurs, Akka est le bon choix - fournit une bonne abstraction, des performances et une intégration avec l'écosystème Java.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.