Cas de bonne utilisation pour Akka [fermé]
j'ai entendu beaucoup de délire sur Akka framework (Java/Scala service platform), mais jusqu'à présent n'ont pas vu beaucoup d'exemples réels de cas d'utilisation, il serait bon. Donc, je serais intéressé par des choses que les développeurs ont utilisé avec succès.
une seule limitation: s'il vous plaît ne pas inclure le cas de l'écriture d'un serveur de chat. (pourquoi? puisque cela a été galvaudé comme un exemple pour beaucoup de choses semblables)
12 réponses
je l'ai utilisé jusqu'à présent dans deux projets réels avec beaucoup de succès. les deux sont dans le domaine de l'information de trafic en temps quasi réel (trafic comme dans les voitures sur les autoroutes), distribué sur plusieurs noeuds, intégrant des messages entre plusieurs parties, des systèmes d'arrière-plan fiables. Je ne suis pas encore autorisé à donner des détails sur les clients, quand j'ai le feu vert, peut-être que ça peut être ajouté comme référence.
Akka a vraiment réussi ces projets, même si nous avons commencé quand il était sur la version 0.7. (nous sommes à l'aide de scala par la voie)
L'un des grands avantages est la facilité à laquelle vous pouvez composer un système à partir d'acteurs et de messages avec presque pas de boilerplating, il balance extrêmement bien sans toutes les complexités de filetage roulé à la main et vous obtenez message asynchrone passant entre les objets presque gratuitement.
il est très bon dans la modélisation de tout type de traitement de message asynchrone. Je préfère écrire n'importe quel type de (web) système de services dans ce style que tout autre style. (Avez-vous déjà essayé d'écrire un service Web asynchrone (côté serveur) avec JAX-WS? c'est beaucoup de la plomberie). Donc je dirais que tout système qui ne veut pas s'accrocher à l'un de ses composants parce que tout est implicitement appelé en utilisant des méthodes synchrones, et qu'un composant est en train de se verrouiller sur quelque chose. Il est très stable et la solution let-it-crash + supervisor à l'échec fonctionne vraiment bien. Tout est facile à programmer et pas difficile de faire un test unitaire.
puis il y a les excellents modules complémentaires. Le module Camel se connecte vraiment bien dans Akka et permet un développement aussi facile de services asynchrones avec des points d'aboutissement configurables.
je suis très heureux avec le cadre et il devient une norme de facto pour les systèmes connectés que nous construisons.
Avertissement: je suis le bon de commande pour Akka
en plus d'offrir un smorgasbord de concurrence qui est beaucoup plus simple à raisonner et à obtenir correct (acteurs, agents, Dataflow concurrence) et avec contrôle de concurrence sous la forme de STM.
voici quelques cas d'utilisation que vous pourriez considérer:
- traitement des transactions (en ligne
jeu, de la finance, statistiques,
Paris, médias sociaux, Télécom,...)
- mise à l'échelle, mise à l'échelle, tolérance aux défauts / HA 1519100920"
- service backend (toute industrie, toute application)
- service REST, SOAP, cometd etc
- agir comme hub de message / couche d'intégration
- mise à l'échelle, retrait d'échelle, tolérance de défaut / HA
- Snap-in de simultanéité/parallélisme ( n'importe quelle application )
- Correct
- Simple comprendre et de travailler avec
- il suffit d'ajouter les pots à votre projet JVM existant (utiliser Scala, Java, Groovy ou JRuby)
- traitement par lots ( toute industrie )
- intégration de Camel pour se connecter avec les sources de données de lot "151970920 Acteurs" diviser et conquérir le lot des charges de travail
- pôle de Communication ( télécommunications, médias web, mobile, médias )
- de l'échelle en place, à l'échelle, de la tolérance de pannes / HA
- serveur de jeux (jeux en ligne, Paris)
- de l'échelle en place, à l'échelle, de la tolérance de pannes / HA
- BI/datamining/à usage général croquer
- de l'échelle en place, à l'échelle, de la tolérance de pannes / HA
- ajouter d'autres cas d'usage agréable ici
un exemple de la façon dont nous l'utilisons serait dans une file d'attente prioritaire de transactions par carte de débit ou de crédit. Nous en avons des millions et l'effort du travail dépend du type de chaîne d'entrée. Si la transaction est de type CHECK nous avons très peu de traitement mais si c'est un point de vente alors il y a beaucoup à faire comme fusionner avec des métadonnées (catégorie, étiquette, étiquettes, etc) et fournir des services (alertes e-mail/sms, détection de fraude, solde de fonds bas, etc). Basé sur le type d'entrée nous composons des classes de divers traits (appelés mixins) nécessaires pour gérer le travail et puis effectuer le travail. Tous ces emplois se retrouvent dans la même file d'attente en mode temps réel de différentes institutions financières. Une fois que les données sont nettoyées, elles sont envoyées à différents magasins de données pour persistance, analyse, ou poussée à une connexion socket, ou pour soulever acteur comet. Les acteurs du travail sont constamment en train d'équilibrer la charge de travail afin que nous puissions traiter les données aussi vite que possible. Nous pouvons également ajouter des services supplémentaires, modèles de persistance, et stm pour les points de décision critiques.
le message de style OTP D'Erlang qui passe sur le JVM constitue un excellent système pour développer des systèmes en temps réel sur les épaules des bibliothèques existantes et des serveurs d'applications.
Akka vous permet de faire passer le message comme vous le feriez dans un traditionnel esb mais avec vitesse! Il vous donne également des outils dans le cadre de gérer la vaste quantité d'acteurs piscines, noeuds distants, et la tolérance de défaut dont vous avez besoin pour votre solution.
nous utilisons Akka pour traiter les appels REST de manière asynchrone - avec async Web server (Netty-based) nous pouvons obtenir une amélioration de 10 fois sur le nombre d'utilisateurs servis par noeud/serveur, en comparant au fil traditionnel par le modèle de demande d'utilisateur.
dites à votre patron que votre facture D'hébergement va chuter par le facteur de 10 et c'est une évidence! Shh... ne le dis pas à Amazon... :)
si vous abstraites le serveur de chat un niveau supérieur, alors vous obtenez la réponse.
Akka fournit un système de messagerie qui s'apparente à Erlang "laisser crash" mentalité.
Donc, les exemples sont des choses qui ont besoin de différents niveaux de durabilité et de fiabilité de la messagerie:
- serveur de Chat
- couche réseau pour un MMO
- pompe à données financières
- Système de Notification pour un iPhone / mobile / n'importe quelle application
- REST Server
- peut-être quelque chose qui ressemble à WebMachine (devinez)
les bonnes choses à propos D'Akka sont les choix qu'il offre pour la persistance, sa mise en œuvre STM, serveur de repos et la tolérance de faute.
Ne faites pas gêné par l'exemple d'un serveur de chat, pensez-y comme un exemple d'une certaine classe de la solution.
avec toute leur excellente documentation, je me sens comme une lacune est cette question exacte, des cas d'utilisation et des exemples. Garder à l'esprit que les exemples ne sont pas anodins.
(écrit avec seulement l'expérience de regarder des vidéos et de jouer avec la source, je n'ai rien implémenté en utilisant akka.)
nous utilisons Akka dans un projet de grande envergure Telco (malheureusement je ne peux pas divulguer beaucoup de détails). Akka actors sont déployés et accessibles à distance par une application web. De cette façon, nous avons un modèle RPC simplifié basé sur Google protobuffer et nous réalisons le parallélisme en utilisant Akka Futures. Jusqu'à présent, ce modèle a fonctionné brillamment. Une remarque: nous utilisons L'API Java.
nous utilisons Akka dans plusieurs projets au travail, dont le plus intéressant est lié à la réparation de véhicules. Principalement au Royaume-Uni, mais s'étendant maintenant aux États-Unis, en Asie, en Australasie et en Europe. Nous faisons appel à des acteurs pour veiller à ce que l'information sur la réparation en cas d'accident soit fournie en temps réel afin de permettre une réparation sûre et rentable des véhicules.
la question avec Akka est vraiment plus 'ce que vous ne pouvez pas faire avec Akka'. Sa capacité à s'intégrer à des cadres puissants, sa puissance l'abstraction et tous les aspects de la tolérance à la faute en font un outil très complet.
Vous pouvez utiliser Akka pour plusieurs sortes de choses.
je travaillais sur un site Web, où j'ai migré la pile de technologie à Scala et Akka. Nous l'avons utilisé pour à peu près tout ce qui s'est passé sur le site. Même si vous pourriez penser Qu'un exemple de Chat est mauvais, Tous sont fondamentalement les mêmes:
- mises à jour en direct sur le site Web (par ex. vues, j'aime, ...)
- affichage des commentaires de l'utilisateur en direct "151950920 de Notification de" services
- recherche et tous les autres types de services
surtout les mises à jour en direct sont faciles car elles se résument à ce qu'est un exemple de Chat. La partie services est un autre sujet intéressant parce que vous pouvez simplement choisir d'utiliser des acteurs distants et même si votre application n'est pas regroupée, vous pouvez la déployer sur différentes machines avec facilité.
J'utilise également Akka pour une application D'autorouteur PCB avec l'idée de pouvoir passer d'un ordinateur portable à un centre de données. Plus vous lui donnez de pouvoir, mieux le résultat sera. Cela est extrêmement difficile à mettre en œuvre si vous essayez d'utiliser la concurrence habituelle parce Qu'Akka vous donne aussi la transparence de localisation.
actuellement en tant que projet de temps libre, je construis un cadre web en utilisant seulement des acteurs. Encore une fois, les avantages sont l'évolutivité d'une seule machine à un groupe entier de machines. En outre, l'utilisation d'une approche axée sur les messages rend votre service logiciel orienté depuis le début. Vous avez tous ces jolis composants, qui se parlent entre eux, mais pas nécessairement qui se connaissent, qui vivent sur la même machine, pas même dans le même centre de données.
et depuis que Google Reader s'est éteint, J'ai commencé avec un lecteur RSS, en utilisant Akka bien sûr. Il s'agit de services encapsulés pour moi. En conclusion: le modèle acteur lui-même est ce que vous devez adopter en premier et Akka est un cadre très fiable vous aider à le mettre en œuvre avec beaucoup d'avantages, vous recevrez le long du chemin.
nous utilisons akka avec son plugin camel pour distribuer notre analyse et le traitement des tendances pour twimpact.com . Nous devons traiter entre 50 et 1000 messages par seconde. En plus du traitement multi-noeuds avec camel, il est également utilisé pour distribuer le travail sur un seul processeur à plusieurs travailleurs pour une performance maximale. Fonctionne très bien, mais nécessite une certaine compréhension de la façon de gérer les congestions.
j'essayais mes mains sur Akka (api Java). Ce que j'ai essayé, C'est de comparer le modèle de concurrence basé sur L'acteur D'Akka avec celui de Java (java.util.simultanée des classes).
le cas d'utilisation était une simple carte canonique réduire la mise en œuvre du nombre de caractères. L'ensemble de données était une collection de chaînes générées au hasard (400 caractères de longueur), et calculer le nombre de voyelles dans eux.
pour Akka j'ai utilisé un BalancedDispatcher (pour l'équilibrage de charge parmi les threads) et RoundRobinRouter (pour garder une limite sur mes acteurs de fonction). Pour Java, j'ai utilisé la technique simple fork join (implémentée sans aucun algorithme de vol de travail) qui permettrait de cartographier / réduire les exécutions et de rejoindre les résultats. Les résultats intermédiaires ont été maintenus dans les files d'attente de blocage pour rendre l'assemblage aussi parallèle que possible. Probablement, si Je ne me trompe pas, cela imiterait en quelque sorte le concept de "boîte aux lettres" des acteurs Akka, où ils reçoivent des messages.
Observation: Les charges moyennes du Till (~50000 cordes) les résultats étaient comparables, variant légèrement dans différentes itérations. Cependant, comme j'ai augmenté ma charge à ~100000 il accrocherait la solution Java. J'ai configuré la solution Java avec 20-30 threads dans cette condition et elle a échoué dans toutes les itérations.
augmentant la charge à 1000000, a été fatal pour Akka aussi. Je peux partager le code avec toute personne intéressée pour avoir une contre-vérification.
donc pour moi, il semble Akka balance mieux que la solution Java multithreaded traditionnelle. Et probablement la raison est la magie sous le capot de Scala.
si je peux modéliser un domaine de problème comme un message d'événement passant un, je pense Akka est un bon choix pour la JVM.
essai effectué le: Java version:1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. 3 Go de ram. Processeur Intel Core i5, 2,5 GHz clock speed
S'il vous plaît note, le domaine de problème utilisé pour le test peut être débattu et j'ai essayé d'être aussi juste que mes connaissances Java permis: -)
nous utilisons Akka dans les systèmes de dialogue parlé ( primetalk ). À la fois en interne et en externe. Pour faire fonctionner simultanément un grand nombre de canaux de téléphonie sur un seul noeud de cluster, il est évidemment nécessaire d'avoir un cadre multithreading. Akka fonctionne parfaitement. Nous avons déjà fait un cauchemar avec le Java-competiency. Et avec Akka c'est comme une balançoire - il fonctionne tout simplement. Robuste et fiable. 24 * 7, non-stop.
à L'intérieur d'un canal nous avons flux d'événements en temps réel traités en parallèle. Notamment: - longue reconnaissance automatique de la parole - est fait avec un acteur; - producteur de sortie audio qui mélange quelques sources audio (y compris la synthèse vocale)); - la conversion texte-parole est un ensemble séparé d'acteurs partagés entre les canaux; - sémantique et traitement des connaissances.
pour réaliser des interconnexions de traitement de signal complexe, nous utilisons SynapseGrid . Il a l'avantage de vérification du flux de données dans les systèmes complexes des acteurs.
j'ai récemment mise en œuvre canoniques map-reduce exemple dans Akka: nombre de mots. C'est donc un cas d'utilisation d'Akka: de meilleures performances. C'était plus une expérience de JRuby et les acteurs D'Akka que toute autre chose, mais cela montre aussi Qu'Akka N'est pas seulement Scala ou Java: il fonctionne sur toutes les langues en plus de JVM.